832 lines
26 KiB
C++
832 lines
26 KiB
C++
#include "stdafx.h"
|
||
|
||
//GEOAPI Acad::ErrorStatus ExplodeAcis(const AcDbEntity *pEntity, AcDbVoidPtrArray &entSet);
|
||
void ExplodeBlock3d(AcDbObjectId idBlock, AcDbVoidPtrArray &entSet);
|
||
//extern BOOL g_bMakeBlock;
|
||
/////////////////////////////////////////////////////////////
|
||
// 路径排列类
|
||
//TArch7 Beta1、2:1;TArch7 Beta3 2
|
||
const Adesk::UInt8 TDbPolyPathArray::g_nVersion = 2;
|
||
ACRX_DXF_DEFINE_MEMBERS(ATSPolyPathArray, ATSPolyCurveEnt, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
|
||
1, ATS_PATH_ARRAY, "ATS_PATH_ARRAY图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
|
||
IMPLEMENT_TENTBASE(TDbPolyPathArray);
|
||
|
||
TDbPolyPathArray::TDbPolyPathArray()
|
||
{
|
||
m_nUnitHeight=1;
|
||
m_nRailFlag=0;
|
||
m_nRatio=1.0;
|
||
}
|
||
BOOL TDbPolyPathArray::IsValid() const
|
||
{
|
||
BOOL bRet=TDbPolyCurveEnt::IsValid();
|
||
if(!bRet)
|
||
return bRet;
|
||
|
||
bRet=(m_nUnitHeight>_DIST_SNAP&&m_nRatio>0.1); //单元宽
|
||
return bRet;
|
||
}
|
||
// 提供对格式刷的支持
|
||
void TDbPolyPathArray::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag)
|
||
{
|
||
assertWriteEnabled();
|
||
TDbPolyCurveEnt::CopyPropertiesFrom(pSrcEntity, gMatchFlag);
|
||
TDbPolyPathArray *pSrc=TDbPolyPathArray::cast(pSrcEntity);
|
||
if(pSrc) {
|
||
if(database()==NULL||
|
||
pSrcEntity->database()==NULL||
|
||
database()==pSrcEntity->database())//add by whl on 060317
|
||
{
|
||
m_idUnit=pSrc->m_idUnit; //自定义扶手
|
||
}
|
||
m_nUnitHeight=pSrc->m_nUnitHeight; //初始间距
|
||
m_nRailFlag=pSrc->m_nRailFlag; //单元对齐方式
|
||
m_nRatio=pSrc->m_nRatio;
|
||
}
|
||
}
|
||
|
||
Acad::ErrorStatus TDbPolyPathArray::subGetClassID(CLSID* pClsid) const
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
// 从DWG读入数据:
|
||
Acad::ErrorStatus TDbPolyPathArray::dwgInFields (AcDbDwgFiler* pFiler)
|
||
{
|
||
assertWriteEnabled();
|
||
|
||
Acad::ErrorStatus es = TDbPolyCurveEnt::dwgInFields(pFiler);
|
||
if(es != Acad::eOk) return es;
|
||
Adesk::UInt8 nVer;
|
||
pFiler->readItem(&nVer);
|
||
if(nVer>g_nVersion) {// Version is too new
|
||
return Acad::eMakeMeProxy;
|
||
}
|
||
|
||
pFiler->readItem(&m_idUnit);
|
||
pFiler->readItem(&m_nUnitHeight);
|
||
pFiler->readItem(&m_nRailFlag);
|
||
|
||
if(nVer>1)//TArch7 Beta3
|
||
pFiler->readItem(&m_nRatio);
|
||
else
|
||
m_nRatio=1.0;
|
||
|
||
return pFiler->filerStatus();
|
||
}
|
||
|
||
Acad::ErrorStatus TDbPolyPathArray::dwgOutFields(AcDbDwgFiler* pFiler) const
|
||
{
|
||
assertReadEnabled();
|
||
Acad::ErrorStatus es = TDbPolyCurveEnt::dwgOutFields(pFiler);
|
||
if(es != Acad::eOk) return es;
|
||
|
||
pFiler->writeItem(g_nVersion);
|
||
|
||
pFiler->writeItem(m_idUnit);
|
||
pFiler->writeItem(m_nUnitHeight);
|
||
pFiler->writeItem(m_nRailFlag);
|
||
pFiler->writeItem(m_nRatio);
|
||
|
||
return pFiler->filerStatus();
|
||
}
|
||
|
||
|
||
Acad::ErrorStatus TDbPolyPathArray::dxfInFields (AcDbDxfFiler* pFiler)
|
||
{
|
||
assertWriteEnabled();
|
||
|
||
Acad::ErrorStatus es = TDbPolyCurveEnt::dxfInFields(pFiler);
|
||
if(es!=Acad::eOk)
|
||
return es;
|
||
|
||
if (!pFiler->atSubclassData(_T("TDbPolyPathArray"))) {
|
||
return Acad::eBadDxfSequence;
|
||
}
|
||
|
||
int fieldsFlags=0;
|
||
resbuf rb;
|
||
int n1;
|
||
double r1;
|
||
XString sName;
|
||
while ((es == Acad::eOk)
|
||
&& ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) {
|
||
switch (rb.restype) {
|
||
case AcDb::kDxfBlockName:
|
||
sName=rb.resval.rstring;
|
||
fieldsFlags |= 0x01;
|
||
break;
|
||
case AcDb::kDxfInt16:
|
||
n1=rb.resval.rint;
|
||
fieldsFlags |= 0x02;
|
||
break;
|
||
case AcDb::kDxfReal:
|
||
r1=rb.resval.rreal;
|
||
fieldsFlags |= 0x08;
|
||
break;
|
||
default:
|
||
// An unrecognized group. Push it back so that
|
||
// the subclass can read it again.
|
||
pFiler->pushBackItem();
|
||
es = Acad::eEndOfFile;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// At this point the es variable must contain eEndOfFile
|
||
// - either from readResBuf() or from pushback. If not,
|
||
// it indicates that an error happened and we should
|
||
// return immediately.
|
||
//
|
||
if (es != Acad::eEndOfFile)
|
||
return Acad::eInvalidResBuf;
|
||
if(!(fieldsFlags&0x01)) {
|
||
pFiler->setError(_T("\nMissing DXF group code: 3"));
|
||
return Acad::eMissingDxfField;
|
||
}
|
||
if(!(fieldsFlags&0x08)) {
|
||
pFiler->setError(_T("\nMissing DXF group code: 40"));
|
||
return Acad::eMissingDxfField;
|
||
}
|
||
|
||
AcDbObjectId idUnit=InitBlock(sName);
|
||
if(!idUnit) {
|
||
pFiler->setError(_T("\nError DXF group code: 3"));
|
||
return Acad::eMissingDxfField;
|
||
}
|
||
m_idUnit=idUnit;
|
||
if(fieldsFlags&0x02)
|
||
m_nRailFlag=n1;
|
||
m_nUnitHeight=r1;
|
||
|
||
|
||
|
||
return pFiler->filerStatus();
|
||
}
|
||
Acad::ErrorStatus TDbPolyPathArray::dxfOutFields(AcDbDxfFiler* pFiler) const
|
||
{
|
||
assertReadEnabled();
|
||
Acad::ErrorStatus es;
|
||
|
||
es = TDbPolyCurveEnt::dxfOutFields(pFiler);
|
||
assert(es == Acad::eOk);
|
||
|
||
es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbPolyPathArray"));
|
||
assert(es == Acad::eOk);
|
||
XString sName=GetSymbolName(m_idUnit);
|
||
|
||
pFiler->writeString(AcDb::kDxfBlockName, sName);
|
||
pFiler->writeDouble(AcDb::kDxfReal, m_nUnitHeight);
|
||
pFiler->writeInt16(AcDb::kDxfInt16, m_nRailFlag);
|
||
|
||
return pFiler->filerStatus();
|
||
}
|
||
//extern double g_nAcadVer;
|
||
Acad::ErrorStatus
|
||
TDbPolyPathArray::ExplodeOrDraw2d(XExplodeDraw &dc) const
|
||
{
|
||
assertReadEnabled();
|
||
if(m_idUnit.isNull()||!m_idUnit.isValid())
|
||
return Acad::eOk;
|
||
|
||
|
||
BOOL bFullExplode = ((TGGiExplodeDraw &)dc).m_bFullExplode;
|
||
BOOL bIsWdDraw = FALSE;
|
||
|
||
if (_tcscmp(dc.Desc(), TGGiWorldViewportDraw::Descriptor()) == 0)
|
||
{
|
||
bIsWdDraw = TRUE;
|
||
bFullExplode = TRUE;
|
||
}
|
||
|
||
if (!bFullExplode)
|
||
{
|
||
return Acad::eOk;
|
||
}
|
||
|
||
XPoint ptLow,ptUp;
|
||
GetBlockExtents(m_idUnit,ptLow,ptUp);
|
||
double nOldSy=ptUp.y-ptLow.y;
|
||
|
||
INT_PTR nQuickMarker=GetQuickMarker();
|
||
XPoly2D polyBase(m_polyBase);
|
||
polyBase.SetElevation(0.0);
|
||
polyBase.Compress();
|
||
|
||
int nEdgeNum=polyBase.TotalSegments();
|
||
{
|
||
BOOL bNewMethod=((g_nAcadVer>15.0001 && g_bMakeBlock) ||
|
||
_tcscmp(dc.Desc(), XAcGiViewDraw::Descriptor())!=0);
|
||
|
||
//add by xlc on 120424 线图案填充显示时裁剪特殊处理
|
||
if (g_bWallLinepatClip)
|
||
{
|
||
bNewMethod = FALSE;
|
||
}
|
||
|
||
double nUnitWidth=GetUnitWidth(),nNewUnitWidth=nUnitWidth;
|
||
int nGsMarker=1;
|
||
for(int n=0; n<nEdgeNum; n++)
|
||
{
|
||
XDirectionCurve cvSeg;
|
||
polyBase.Nth(n, cvSeg);
|
||
if(GetBaseType()==0)
|
||
cvSeg=cvSeg.Offset(m_nUnitHeight*(1-m_nRatio)*0.5,LS_FINITE);
|
||
else if(GetBaseType()==1)
|
||
cvSeg=cvSeg.Offset(-m_nUnitHeight*(1+m_nRatio)*0.5,LS_FINITE);
|
||
else
|
||
cvSeg=cvSeg.Offset(-m_nUnitHeight*m_nRatio/2,LS_FINITE);
|
||
|
||
XDirectionCurve seg2d=cvSeg;
|
||
seg2d.SetElevation(0.0);
|
||
double leng=seg2d.GetLength();
|
||
if(leng<_DIST_SNAP)
|
||
continue;
|
||
|
||
double sy=GetScaleY(),sz=sy,sx=sy;
|
||
int nSeg=int((leng+_DIST_SNAP)/nUnitWidth);
|
||
if(nSeg<1)
|
||
continue;
|
||
|
||
double nEmpty=leng-nSeg*nUnitWidth;
|
||
if(IsEqualScale())
|
||
{
|
||
if(IsAutoExpand())
|
||
nNewUnitWidth=(leng+nEmpty/(nSeg-1))/nSeg;
|
||
sx=sy;
|
||
}
|
||
else
|
||
{
|
||
nNewUnitWidth=leng/nSeg;
|
||
sx*=nNewUnitWidth/nUnitWidth;
|
||
}
|
||
|
||
double sArc=1.0;
|
||
//if(cvSeg.IsMinusArc())
|
||
// sArc=(cvSeg.GetArc().radius-nOldSy)/cvSeg.GetArc().radius;
|
||
|
||
for(int i=0; i<nSeg; i++)
|
||
{
|
||
dc.SetSelectionMarker(nGsMarker);
|
||
nGsMarker++;
|
||
if(nQuickMarker && (nGsMarker-1)!=nQuickMarker) //用于捕捉时加速
|
||
continue;
|
||
|
||
XPointDir2d ptIns;
|
||
double nDist=i*nNewUnitWidth;
|
||
double dx=nNewUnitWidth;
|
||
if(IsEqualScale()&&!IsAutoExpand())
|
||
{
|
||
nDist+=nEmpty/2;
|
||
dx+=nEmpty/2;
|
||
}
|
||
|
||
if(IsReversed())
|
||
{
|
||
seg2d.Polar(nDist+nNewUnitWidth, ptIns);
|
||
ptIns.z = cvSeg.StartPoint().z;
|
||
if(seg2d.Is(CURVE_LINE))
|
||
dc<<XBlockRef(m_idUnit, ptIns, AcGeScale3d(-sx,sy,sz), ptIns.nDirection, bNewMethod);
|
||
else
|
||
{
|
||
XPointDir2d ptIns1,ptMid,ptMid1;
|
||
seg2d.Polar(nDist,ptIns1);
|
||
seg2d.Polar(nDist+dx/2,ptMid);
|
||
Midpoint(ptIns,ptIns1,ptMid1);
|
||
XPoint vtOffset=ptMid-ptMid1;
|
||
XPoint vt=ptIns-ptIns1;
|
||
vt.Normalize();
|
||
dc<<XBlockRef(m_idUnit, ptIns+vtOffset, AcGeScale3d(-sx*(ptIns1.Distance2d(ptIns)/nNewUnitWidth)*sArc,sy,sz),vt.AsAcGeVector2d().angle(), bNewMethod);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
seg2d.Polar(nDist, ptIns);
|
||
ptIns.z = cvSeg.StartPoint().z;
|
||
if(seg2d.Is(CURVE_LINE))
|
||
dc<<XBlockRef(m_idUnit, ptIns, AcGeScale3d(sx,sy,sz), ptIns.nDirection, bNewMethod);
|
||
else
|
||
{
|
||
XPointDir2d ptIns1,ptMid,ptMid1;
|
||
seg2d.Polar(nDist+nNewUnitWidth,ptIns1);
|
||
seg2d.Polar(nDist+dx/2,ptMid);
|
||
Midpoint(ptIns,ptIns1,ptMid1);
|
||
XPoint vtOffset=ptMid-ptMid1;
|
||
XPoint vt=ptIns1-ptIns;
|
||
vt.Normalize();
|
||
dc<<XBlockRef(m_idUnit, ptIns+vtOffset, AcGeScale3d(sx*(ptIns1.Distance2d(ptIns)/nNewUnitWidth)*sArc,sy,sz),vt.AsAcGeVector2d().angle(), bNewMethod);
|
||
}
|
||
}
|
||
if(nQuickMarker && (nGsMarker-1)==nQuickMarker)
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
return Acad::eOk;
|
||
}
|
||
Acad::ErrorStatus
|
||
TDbPolyPathArray::subGetOsnapPoints( AcDb::OsnapMode osnapMode,
|
||
INT_PTR gsSelectionMark,
|
||
const AcGePoint3d& ptPick,
|
||
const AcGePoint3d& lastPoint,
|
||
const AcGeMatrix3d& viewXform,
|
||
AcGePoint3dArray& snapPoints,
|
||
AcDbIntArray& geomIds) const
|
||
{
|
||
assertReadEnabled();
|
||
XPushMemVar<BOOL> vTemp(g_bSnapCurveBase,TRUE);
|
||
return TDbCurveEntity::GetOsnapPoints(osnapMode,gsSelectionMark,
|
||
ptPick, lastPoint, viewXform,snapPoints, geomIds);
|
||
}
|
||
Acad::ErrorStatus
|
||
TDbPolyPathArray::subGetOsnapPoints( AcDb::OsnapMode osnapMode,
|
||
INT_PTR gsSelectionMark,
|
||
const AcGePoint3d& ptPick,
|
||
const AcGePoint3d& lastPoint,
|
||
const AcGeMatrix3d& viewXform,
|
||
AcGePoint3dArray& snapPoints,
|
||
AcDbIntArray& geomIds,
|
||
const AcGeMatrix3d &mat) const
|
||
{
|
||
assertReadEnabled();
|
||
Acad::ErrorStatus es=Acad::eOk;
|
||
XPushMemVar<BOOL> vTemp(g_bSnapCurveBase,TRUE);
|
||
return TDbCurveEntity::GetOsnapPoints(osnapMode,gsSelectionMark,
|
||
ptPick, lastPoint, viewXform,snapPoints, geomIds,mat);
|
||
}
|
||
Acad::ErrorStatus TDbPolyPathArray::subTransformBy(const AcGeMatrix3d&mat)
|
||
{
|
||
assertWriteEnabled();
|
||
|
||
Acad::ErrorStatus es=TDbPolyCurveEnt::subTransformBy(mat);
|
||
ads_matrix mat1;
|
||
AsAdsMatrix(mat,mat1);
|
||
if(IsMirrorMatrix(mat1))
|
||
{
|
||
Reverse();//左右翻转
|
||
m_polyBase.Reverse();//上下翻转
|
||
}
|
||
|
||
return es;
|
||
}
|
||
|
||
// k3D 有错
|
||
TEntityBase::DrawType TDbPolyPathArray::GetDrawType() const
|
||
{
|
||
return TEntityBase::k2Dand3D;
|
||
}
|
||
|
||
const TCHAR * TDbPolyPathArray::GetDefaultLayer() const
|
||
{
|
||
return LAY_RAIL;
|
||
}
|
||
void TDbPolyPathArray::GetTips(DList<TObjInfoUnit> &lstInfo) const
|
||
{
|
||
assertReadEnabled();
|
||
lstInfo.Append(new TObjInfoUnit(_T("对象类型"), _T("线图案")));
|
||
lstInfo.Append(new TObjInfoUnit(_T("线宽"), Dist2Str(m_nUnitHeight)));
|
||
lstInfo.Append(new TObjInfoUnit(_T("填充比例"), XString(_T("%d %%"),(int)(m_nRatio*100))));
|
||
lstInfo.Append(new TObjInfoUnit(_T("长度"), Dist2Str(m_polyBase.Distance2d())));
|
||
if(IsEqualScale())
|
||
lstInfo.Append(new TObjInfoUnit(_T("对齐方式"), IsAutoExpand()? _T("两边对齐") : _T("中间对齐")));
|
||
else
|
||
lstInfo.Append(new TObjInfoUnit(_T("对齐方式"), _T("单元自调")));
|
||
XString sBase;
|
||
if(GetBaseType()==0)
|
||
sBase=_T("基线居左");
|
||
else if(GetBaseType()==1)
|
||
sBase=_T("基线居右");
|
||
else
|
||
sBase=_T("基线居中");
|
||
lstInfo.Append(new TObjInfoUnit(_T("基线位置"), sBase));
|
||
}
|
||
////////////////////////////////////////////////////////////////
|
||
AcDbObjectId TDbPolyPathArray::GetUnitId() const
|
||
{
|
||
assertReadEnabled();
|
||
return m_idUnit;
|
||
}
|
||
int TDbPolyPathArray::GetBaseType() const
|
||
{
|
||
assertReadEnabled();
|
||
if((m_nRailFlag&RF_RIGHTBASE)!=0)
|
||
return 1;
|
||
else if((m_nRailFlag&RF_MIDBASE)!=0)
|
||
return 2;
|
||
else
|
||
return 0;
|
||
}
|
||
void TDbPolyPathArray::SetBaseType(int type)
|
||
{
|
||
assertWriteEnabled();
|
||
if(type==1)
|
||
{
|
||
m_nRailFlag |= RF_RIGHTBASE;
|
||
m_nRailFlag &=~RF_MIDBASE;
|
||
}
|
||
else if(type==2)
|
||
{
|
||
m_nRailFlag &=~RF_RIGHTBASE;
|
||
m_nRailFlag |= RF_MIDBASE;
|
||
}
|
||
else
|
||
{
|
||
m_nRailFlag &=~RF_RIGHTBASE;
|
||
m_nRailFlag &=~RF_MIDBASE;
|
||
}
|
||
}
|
||
BOOL TDbPolyPathArray::IsAutoExpand() const
|
||
{
|
||
assertReadEnabled();
|
||
return ((m_nRailFlag&RF_AUTOEXPAND)!=0);
|
||
}
|
||
void TDbPolyPathArray::SetAutoExpand(BOOL bTrue)
|
||
{
|
||
assertWriteEnabled();
|
||
if(bTrue)
|
||
m_nRailFlag |= RF_AUTOEXPAND;
|
||
else
|
||
m_nRailFlag &= ~RF_AUTOEXPAND;
|
||
}
|
||
BOOL TDbPolyPathArray::IsEqualScale() const
|
||
{
|
||
assertReadEnabled();
|
||
return ((m_nRailFlag&RF_EQUALSCALE)!=0);
|
||
}
|
||
void TDbPolyPathArray::SetEqualScale(BOOL bTrue)
|
||
{
|
||
assertWriteEnabled();
|
||
if(bTrue)
|
||
m_nRailFlag |= RF_EQUALSCALE;
|
||
else
|
||
m_nRailFlag &= ~RF_EQUALSCALE;
|
||
}
|
||
BOOL TDbPolyPathArray::IsReversed() const
|
||
{
|
||
assertReadEnabled();
|
||
return ((m_nRailFlag&RF_REVERSE)!=0);
|
||
}
|
||
void TDbPolyPathArray::Reverse()
|
||
{
|
||
assertWriteEnabled();
|
||
if((m_nRailFlag&RF_REVERSE)!=0)
|
||
m_nRailFlag &= ~RF_REVERSE;
|
||
else
|
||
m_nRailFlag |= RF_REVERSE;
|
||
}
|
||
void TDbPolyPathArray::SetUnitId(AcDbObjectId id)
|
||
{
|
||
assertWriteEnabled();
|
||
m_idUnit=id;
|
||
}
|
||
double TDbPolyPathArray::GetScaleY()const
|
||
{
|
||
XPoint ptLow, ptUp;
|
||
double nRet=1.0;
|
||
if(GetBlockExtents(m_idUnit, ptLow, ptUp)==RTNORM)
|
||
{
|
||
double height0=ptUp.y-ptLow.y;
|
||
nRet=m_nUnitHeight*m_nRatio/height0;
|
||
}
|
||
return nRet;
|
||
}
|
||
double TDbPolyPathArray::GetUnitHeight()const
|
||
{
|
||
assertReadEnabled();
|
||
return m_nUnitHeight;
|
||
}
|
||
void TDbPolyPathArray::SetUnitHeight(double height)
|
||
{
|
||
assertWriteEnabled();
|
||
m_nUnitHeight=height;
|
||
}
|
||
double TDbPolyPathArray::GetRatio()const
|
||
{
|
||
assertReadEnabled();
|
||
return m_nRatio;
|
||
}
|
||
void TDbPolyPathArray::SetRatio(double ratio)
|
||
{
|
||
assertWriteEnabled();
|
||
m_nRatio=ratio;
|
||
}
|
||
double TDbPolyPathArray::GetUnitWidth() const
|
||
{
|
||
assertReadEnabled();
|
||
XPoint ptLow, ptUp;
|
||
GetBlockExtents(m_idUnit, ptLow, ptUp);
|
||
double width0=ptUp.x-ptLow.x;
|
||
return GetScaleY()*width0;
|
||
}
|
||
|
||
int EditPolyPathArray(AcDbObjectId id);
|
||
void InitDbPolyPathArray(BOOL bTrue)
|
||
{
|
||
AecObjectEditMethod pOldEdit=NULL;
|
||
if(bTrue)
|
||
{
|
||
TDbPolyPathArray::rxInit();
|
||
acrxBuildClassHierarchy();
|
||
TDbPolyPathArray::InitMatchProtocol(TRUE);
|
||
pOldEdit=TDbPolyPathArray::SetEditMethod(EditPolyPathArray);
|
||
}
|
||
else
|
||
{
|
||
TDbPolyPathArray::InitMatchProtocol(FALSE);
|
||
TDbPolyPathArray::SetEditMethod(pOldEdit);
|
||
deleteAcRxClass(TDbPolyPathArray::desc());
|
||
}
|
||
}
|
||
|
||
//TARCH_IMPEXP Acad::ErrorStatus ExplodeBlockRef(const AcDbBlockTableRecord &blockRec,
|
||
// const AcGeMatrix3d &mat, AcDbVoidPtrArray &entSet);
|
||
|
||
void ExplodeBlock3d(AcDbObjectId idBlock, AcDbVoidPtrArray & entSet)
|
||
{
|
||
//AcDbBlockReference blkIns(AcGePoint3d(0,0,0), idBlock);
|
||
AcDbVoidPtrArray entSet0;
|
||
ads_matrix mat;
|
||
OPENOBJ_BEGIN(idBlock, AcDb::kForRead, AcDbBlockTableRecord, pBlock);
|
||
ASSERT(pBlock);
|
||
XPoint ptOrg=pBlock->origin();
|
||
ConstructMatrix(ptOrg, XPoint(0,0,0), 1.0, 1.0, 1.0, 0.0, mat);
|
||
ExplodeBlockRef(*pBlock, AsAcGeMatrix3d(mat), entSet0);
|
||
OPENOBJ_END();
|
||
|
||
//if(blkIns.explode(entSet0)==Acad::eOk) {
|
||
int nCount=entSet0.length();
|
||
for(int i=0; i<nCount; i++) {
|
||
AcDbEntity *pEnt=(AcDbEntity *)entSet0[i];
|
||
AcRxClass *pRxInfo=pEnt->isA();
|
||
if(pEnt->isKindOf(AcDbFace::desc())) { // 3DFACE
|
||
entSet.append(pEnt);
|
||
entSet0.removeAt(i);
|
||
i--;
|
||
nCount--;
|
||
} else if(pEnt->isKindOf(AcDbPolyFaceMesh::desc()) ||
|
||
pEnt->isKindOf(AcDbPolygonMesh::desc())) {
|
||
pEnt->explode(entSet);
|
||
} else if(_tcscmp(pRxInfo->dxfName(), _T("3DSOLID"))==0 ||
|
||
_tcscmp(pRxInfo->dxfName(), _T("REGION"))==0) {
|
||
ExplodeAcis(pEnt, entSet);
|
||
} else {
|
||
BOOL bExp=FALSE;
|
||
if(pEnt->isKindOf(AcDbPolyline::desc())) {
|
||
AcDbPolyline *pline=AcDbPolyline::cast(pEnt);
|
||
ASSERT(pline);
|
||
double nWidth=0.0;
|
||
if(pline->normal()==AcGeVector3d(0,0,1) && pline->thickness()>_DIST_SNAP &&
|
||
pline->getConstantWidth(nWidth)==Acad::eOk && nWidth<1.0E-3) {
|
||
double nHeight=pline->thickness();
|
||
XPoly2D poly;
|
||
PolyConvert(*pline, poly);
|
||
XPoly poly1;
|
||
poly.MapToPolygon(poly1);
|
||
if(poly.IsClosed()) {
|
||
XPolygonEx polyEx(poly1);
|
||
XTrianglePface lstTris;
|
||
if(polyEx.Trianglize(lstTris, FALSE)==RTNORM) {
|
||
for(int n=0; n<lstTris.Length(); n++) {
|
||
XTriangle *triangle=lstTris[n];
|
||
Adesk::Boolean bSide1=!(triangle->m_nFlag&SIDE1_INVISIBLE);
|
||
Adesk::Boolean bSide2=!(triangle->m_nFlag&SIDE2_INVISIBLE);
|
||
Adesk::Boolean bSide3=!(triangle->m_nFlag&SIDE3_INVISIBLE);
|
||
AcDbFace *pFace=new AcDbFace(triangle->vertex1, triangle->vertex2,
|
||
triangle->vertex3, triangle->vertex1, bSide1, bSide2, bSide3);
|
||
entSet.append(pFace);
|
||
triangle->vertex1.z += nHeight;
|
||
triangle->vertex2.z += nHeight;
|
||
triangle->vertex3.z += nHeight;
|
||
pFace=new AcDbFace(triangle->vertex1, triangle->vertex2,
|
||
triangle->vertex3, triangle->vertex1, bSide1, bSide2, bSide3);
|
||
entSet.append(pFace);
|
||
}
|
||
}
|
||
}
|
||
int nSeg=poly1.Length();
|
||
if(!poly.IsClosed())
|
||
nSeg --;
|
||
for(int n=0; n<nSeg; n++) {
|
||
XLine ln, ln1;
|
||
poly1.NthLine(n, ln);
|
||
ln1=ln;
|
||
ln1.StartPoint().z += nHeight;
|
||
ln1.EndPoint().z += nHeight;
|
||
bool bVisStart=poly.HitTestOnCurve(ln.StartPoint(), 1.0E-3)>0;
|
||
bool bVisEnd=poly.HitTestOnCurve(ln.EndPoint(), 1.0E-3)>0;
|
||
AcDbFace *pFace=new AcDbFace(ln.StartPoint(), ln.EndPoint(),
|
||
ln1.EndPoint(), ln1.StartPoint(),
|
||
Adesk::kTrue, bVisStart, Adesk::kTrue, bVisEnd);
|
||
entSet.append(pFace);
|
||
}
|
||
bExp=TRUE;
|
||
}
|
||
}
|
||
if(!bExp) {
|
||
entSet.append(pEnt);
|
||
entSet0.removeAt(i);
|
||
i--;
|
||
nCount--;
|
||
}
|
||
}
|
||
|
||
}
|
||
//}
|
||
ReleaseEntSet(entSet0);
|
||
}
|
||
// 编辑路径排列
|
||
int EditPolyPathArray(AcDbObjectId id)
|
||
{
|
||
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPolyPathArray, pStep);
|
||
if(!pStep)
|
||
return RTERROR;
|
||
while(1) {
|
||
const TCHAR *szPrompts[2]= {
|
||
_T("\n选择 [加顶点(A)/减顶点(D)/设顶点(S)/宽度(W)/填充比例(G)/图案翻转(F)/单元对齐(R)/基线位置(B)]<退出>:"),
|
||
_T("\n选择 [宽度(W)/填充比例(G)/图案翻转(F)/单元对齐(R)/基线位置(B)]<退出>:")
|
||
};
|
||
const TCHAR *szKeywords[2] = {_T("A D S W G F R B"), _T("W G F R B"),};
|
||
int nIdx=pStep->IsBind()? 1: 0;
|
||
XString sKeyword;
|
||
int nRet=0;
|
||
INITGET_BEG(0, szKeywords[nIdx]);
|
||
nRet=ads_getkword(szPrompts[nIdx], sKeyword);
|
||
INITGET_END();
|
||
|
||
if(nRet!=RTNORM)
|
||
break;
|
||
if(sKeyword[0]==_T('A')) {
|
||
int nOsMode=0;
|
||
xg_getvar(_T("OSMODE"), &nOsMode);
|
||
nOsMode &= ~0x4000;
|
||
nOsMode |= OS_INT;
|
||
XPushVar<int> tVar(_T("OSMODE"), nOsMode);
|
||
XPoint ptAdd;
|
||
if(XGetPoint(NULL, _T("\n点取新的顶点位置"), ptAdd)==RTNORM) {
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
if(!pStep->AddVertex(ptAdd)) {
|
||
adsout << _T("\n请正确点取!");
|
||
}
|
||
pStep->downgradeOpen();
|
||
}
|
||
} else if(sKeyword[0]==_T('D')) {
|
||
XPushVar<int> osmode(_T("OSMODE"), OS_END);
|
||
XPushMemVar<BOOL> vTemp(g_bSnapCurveBase,TRUE);
|
||
XPoint ptVert;
|
||
while(ads_getpoint(NULL, _T("\n选取顶点: "), ptVert)==RTNORM) {
|
||
int nPos=pStep->HitTestOnBase2d(ptVert);
|
||
if(nPos>0) {
|
||
nPos--;
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
pStep->RemoveVertexAt(nPos);
|
||
pStep->downgradeOpen();
|
||
}else {
|
||
adsout << _T("\n请正确点取!");
|
||
}
|
||
}
|
||
} else if(sKeyword[0]==_T('S')) {
|
||
XPushVar<int> osmode(_T("OSMODE"), OS_END);
|
||
XPushMemVar<BOOL> vTemp(g_bSnapCurveBase,TRUE);
|
||
XPoint ptVert;
|
||
while(ads_getpoint(NULL, _T("\n选取顶点: "), ptVert)==RTNORM) {
|
||
int nPos=pStep->HitTestOnBase2d(ptVert);
|
||
if(nPos>0) {
|
||
nPos--;
|
||
if(nPos==0) {
|
||
XPoly2D poly2d;
|
||
AcGeVector3d normal;
|
||
pStep->GetPathPoly(poly2d,normal);
|
||
poly2d.SetElevation(0.0);
|
||
if(poly2d.IsClosed()) {
|
||
int nAns=YesNoQuestion(_T("\n起点和终点的平面投影相同,您指的是起点吗"));
|
||
if(nAns==RTCAN)
|
||
continue;
|
||
else if(nAns==Q_NO)
|
||
nPos = poly2d.Length();
|
||
}
|
||
}
|
||
double nElev=pStep->GetElevationAt(nPos);
|
||
adsout << _T("\n改夹角[A]/点取[P]/输入顶点标高<")
|
||
<< Dist2Str(nElev)
|
||
<< _T(">: ");
|
||
int nCode;
|
||
INITGET_BEG(0, _T("A P"));
|
||
nCode=ads_getreal(_T(""), &nElev);
|
||
INITGET_END();
|
||
if(nCode==RTKWORD) {
|
||
TCHAR szKey[80]=_T("");
|
||
ads_getinput(szKey);
|
||
if(szKey[0]==_T('P')) {
|
||
XPushVar<int> osMode(_T("OSMODE"), OS_NEA);
|
||
XPoint ptElev;
|
||
nCode=ads_getpoint(NULL, _T("\n点取参照物:"), ptElev);
|
||
if(nCode==RTNORM) {
|
||
nElev=ptElev.z;
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
pStep->SetElevationAt(nPos, nElev);
|
||
pStep->downgradeOpen();
|
||
}
|
||
} else if(szKey[0]==_T('A')) {
|
||
double nOldAng=pStep->GetSweepAngleAt(nPos)*180.0/PI;
|
||
nCode=GetReal(_T("\n输入夹角"), nOldAng);
|
||
if(nCode==RTNORM) {
|
||
nOldAng *= PI/180.0;
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
pStep->SetSweepAngleAt(nPos, nOldAng);
|
||
pStep->downgradeOpen();
|
||
}
|
||
}
|
||
} else if(nCode==RTNORM) {
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
pStep->SetElevationAt(nPos, nElev);
|
||
pStep->downgradeOpen();
|
||
}
|
||
} else {
|
||
adsout << _T("\n请正确点取!");
|
||
}
|
||
}
|
||
} else if(sKeyword[0]==_T('W')) {
|
||
double nWidth=pStep->GetUnitHeight();
|
||
nRet=GetReal(_T("\n线宽"), nWidth, RSG_NOZERO|RSG_NONEG);
|
||
if(nRet==RTCAN)
|
||
break;
|
||
if(nRet==RTNORM) {
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
pStep->SetUnitHeight(nWidth);
|
||
pStep->downgradeOpen();
|
||
}
|
||
}else if(sKeyword[0]==_T('G')) {
|
||
double nWidth=pStep->GetRatio();
|
||
nRet=GetReal(_T("\n填充比例"), nWidth, RSG_NOZERO|RSG_NONEG);
|
||
if(nRet==RTCAN)
|
||
break;
|
||
if(nRet==RTNORM) {
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
pStep->SetRatio(nWidth);
|
||
pStep->downgradeOpen();
|
||
}
|
||
}
|
||
else if(sKeyword[0]==_T('R'))
|
||
{
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
if(!pStep->IsEqualScale())
|
||
{
|
||
pStep->SetEqualScale(TRUE);
|
||
pStep->SetAutoExpand(TRUE);
|
||
adsout<<_T("<两边对齐>");
|
||
}
|
||
else if(pStep->IsAutoExpand())
|
||
{
|
||
pStep->SetAutoExpand(FALSE);
|
||
adsout<<_T("<中间对齐>");
|
||
}
|
||
else
|
||
{
|
||
pStep->SetEqualScale(FALSE);
|
||
adsout<<_T("<单元自调>");
|
||
}
|
||
pStep->downgradeOpen();
|
||
}
|
||
else if(sKeyword[0]==_T('B'))
|
||
{
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
if(pStep->GetBaseType()==0)
|
||
{
|
||
pStep->SetBaseType(1);
|
||
adsout<<_T("<基线居右>");
|
||
}
|
||
else if(pStep->GetBaseType()==1)
|
||
{
|
||
pStep->SetBaseType(2);
|
||
adsout<<_T("<基线居中>");
|
||
}
|
||
else
|
||
{
|
||
pStep->SetBaseType(0);
|
||
adsout<<_T("<基线居左>");
|
||
}
|
||
pStep->downgradeOpen();
|
||
}
|
||
else if(sKeyword[0]==_T('F'))
|
||
{
|
||
if(pStep->upgradeOpen()!=Acad::eOk)
|
||
return RTERROR;
|
||
pStep->Reverse();
|
||
pStep->downgradeOpen();
|
||
}
|
||
}
|
||
OPENOBJ_END();
|
||
|
||
return RTNORM;
|
||
}
|
||
|
||
|