Files
envi-code/SourceCode/Code2026/tg_shs/shs_kernal/DbPolyPathArray.cpp
T

831 lines
26 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
#include "stdafx.h"
2026-09-28 15:28:50 +08:00
//GEOAPI Acad::ErrorStatus ExplodeAcis(const AcDbEntity *pEntity, AcDbVoidPtrArray &entSet);
void ExplodeBlock3d(AcDbObjectId idBlock, AcDbVoidPtrArray &entSet);
//extern BOOL g_bMakeBlock;
/////////////////////////////////////////////////////////////
2026-10-04 00:04:20 +08:00
// 路径排列类
//TArch7 Beta1、2:1;TArch7 Beta3 2
2026-09-28 15:28:50 +08:00
const Adesk::UInt8 TDbPolyPathArray::g_nVersion = 2;
ACRX_DXF_DEFINE_MEMBERS(ATSPolyPathArray, ATSPolyCurveEnt, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent,
2026-10-04 00:04:20 +08:00
1, ATS_PATH_ARRAY, "ATS_PATH_ARRAY图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com");
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
bRet=(m_nUnitHeight>_DIST_SNAP&&m_nRatio>0.1); //单元宽
2026-09-28 15:28:50 +08:00
return bRet;
}
2026-10-04 00:04:20 +08:00
// 提供对格式刷的支持
2026-09-28 15:28:50 +08:00
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
{
2026-10-04 00:04:20 +08:00
m_idUnit=pSrc->m_idUnit; //自定义扶手
2026-09-28 15:28:50 +08:00
}
2026-10-04 00:04:20 +08:00
m_nUnitHeight=pSrc->m_nUnitHeight; //初始间距
m_nRailFlag=pSrc->m_nRailFlag; //单元对齐方式
2026-09-28 15:28:50 +08:00
m_nRatio=pSrc->m_nRatio;
}
}
Acad::ErrorStatus TDbPolyPathArray::subGetClassID(CLSID* pClsid) const
{
return Acad::eOk;
}
2026-10-04 00:04:20 +08:00
// 从DWG读入数据:
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
//add by xlc on 120424 线图案填充显示时裁剪特殊处理
2026-09-28 15:28:50 +08:00
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++;
2026-10-04 00:04:20 +08:00
if(nQuickMarker && (nGsMarker-1)!=nQuickMarker) //用于捕捉时加速
2026-09-28 15:28:50 +08:00
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))
{
2026-10-04 00:04:20 +08:00
Reverse();//左右翻转
m_polyBase.Reverse();//上下翻转
2026-09-28 15:28:50 +08:00
}
return es;
}
2026-10-04 00:04:20 +08:00
// k3D 有错
2026-09-28 15:28:50 +08:00
TEntityBase::DrawType TDbPolyPathArray::GetDrawType() const
{
return TEntityBase::k2Dand3D;
}
const TCHAR * TDbPolyPathArray::GetDefaultLayer() const
{
return LAY_RAIL;
}
void TDbPolyPathArray::GetTips(DList<TObjInfoUnit> &lstInfo) const
{
assertReadEnabled();
2026-10-04 00:04:20 +08:00
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())));
2026-09-28 15:28:50 +08:00
if(IsEqualScale())
2026-10-04 00:04:20 +08:00
lstInfo.Append(new TObjInfoUnit(_T("对齐方式"), IsAutoExpand()? _T("两边对齐") : _T("中间对齐")));
2026-09-28 15:28:50 +08:00
else
2026-10-04 00:04:20 +08:00
lstInfo.Append(new TObjInfoUnit(_T("对齐方式"), _T("单元自调")));
2026-09-28 15:28:50 +08:00
XString sBase;
if(GetBaseType()==0)
2026-10-04 00:04:20 +08:00
sBase=_T("基线居左");
2026-09-28 15:28:50 +08:00
else if(GetBaseType()==1)
2026-10-04 00:04:20 +08:00
sBase=_T("基线居右");
2026-09-28 15:28:50 +08:00
else
2026-10-04 00:04:20 +08:00
sBase=_T("基线居中");
lstInfo.Append(new TObjInfoUnit(_T("基线位置"), sBase));
2026-09-28 15:28:50 +08:00
}
////////////////////////////////////////////////////////////////
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);
}
2026-10-04 00:04:20 +08:00
// 编辑路径排列
2026-09-28 15:28:50 +08:00
int EditPolyPathArray(AcDbObjectId id)
{
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbPolyPathArray, pStep);
if(!pStep)
return RTERROR;
while(1) {
const TCHAR *szPrompts[2]= {
2026-10-04 00:04:20 +08:00
_T("\n选择 [加顶点(A)/减顶点(D)/设顶点(S)/宽度(W)/填充比例(G)/图案翻转(F)/单元对齐(R)/基线位置(B)]<退出>:"),
_T("\n选择 [宽度(W)/填充比例(G)/图案翻转(F)/单元对齐(R)/基线位置(B)]<退出>:")
2026-09-28 15:28:50 +08:00
};
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;
2026-10-04 00:04:20 +08:00
if(XGetPoint(NULL, _T("\n点取新的顶点位置"), ptAdd)==RTNORM) {
2026-09-28 15:28:50 +08:00
if(pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
if(!pStep->AddVertex(ptAdd)) {
2026-10-04 00:04:20 +08:00
adsout << _T("\n请正确点取!");
2026-09-28 15:28:50 +08:00
}
pStep->downgradeOpen();
}
} else if(sKeyword[0]==_T('D')) {
XPushVar<int> osmode(_T("OSMODE"), OS_END);
XPushMemVar<BOOL> vTemp(g_bSnapCurveBase,TRUE);
XPoint ptVert;
2026-10-04 00:04:20 +08:00
while(ads_getpoint(NULL, _T("\n选取顶点: "), ptVert)==RTNORM) {
2026-09-28 15:28:50 +08:00
int nPos=pStep->HitTestOnBase2d(ptVert);
if(nPos>0) {
nPos--;
if(pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->RemoveVertexAt(nPos);
pStep->downgradeOpen();
}else {
2026-10-04 00:04:20 +08:00
adsout << _T("\n请正确点取!");
2026-09-28 15:28:50 +08:00
}
}
} else if(sKeyword[0]==_T('S')) {
XPushVar<int> osmode(_T("OSMODE"), OS_END);
XPushMemVar<BOOL> vTemp(g_bSnapCurveBase,TRUE);
XPoint ptVert;
2026-10-04 00:04:20 +08:00
while(ads_getpoint(NULL, _T("\n选取顶点: "), ptVert)==RTNORM) {
2026-09-28 15:28:50 +08:00
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()) {
2026-10-04 00:04:20 +08:00
int nAns=YesNoQuestion(_T("\n起点和终点的平面投影相同,您指的是起点吗"));
2026-09-28 15:28:50 +08:00
if(nAns==RTCAN)
continue;
else if(nAns==Q_NO)
nPos = poly2d.Length();
}
}
double nElev=pStep->GetElevationAt(nPos);
2026-10-04 00:04:20 +08:00
adsout << _T("\n改夹角[A]/点取[P]/输入顶点标高<")
2026-09-28 15:28:50 +08:00
<< 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;
2026-10-04 00:04:20 +08:00
nCode=ads_getpoint(NULL, _T("\n点取参照物:"), ptElev);
2026-09-28 15:28:50 +08:00
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;
2026-10-04 00:04:20 +08:00
nCode=GetReal(_T("\n输入夹角"), nOldAng);
2026-09-28 15:28:50 +08:00
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 {
2026-10-04 00:04:20 +08:00
adsout << _T("\n请正确点取!");
2026-09-28 15:28:50 +08:00
}
}
} else if(sKeyword[0]==_T('W')) {
double nWidth=pStep->GetUnitHeight();
2026-10-04 00:04:20 +08:00
nRet=GetReal(_T("\n线宽"), nWidth, RSG_NOZERO|RSG_NONEG);
2026-09-28 15:28:50 +08:00
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();
2026-10-04 00:04:20 +08:00
nRet=GetReal(_T("\n填充比例"), nWidth, RSG_NOZERO|RSG_NONEG);
2026-09-28 15:28:50 +08:00
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);
2026-10-04 00:04:20 +08:00
adsout<<_T("<两边对齐>");
2026-09-28 15:28:50 +08:00
}
else if(pStep->IsAutoExpand())
{
pStep->SetAutoExpand(FALSE);
2026-10-04 00:04:20 +08:00
adsout<<_T("<中间对齐>");
2026-09-28 15:28:50 +08:00
}
else
{
pStep->SetEqualScale(FALSE);
2026-10-04 00:04:20 +08:00
adsout<<_T("<单元自调>");
2026-09-28 15:28:50 +08:00
}
pStep->downgradeOpen();
}
else if(sKeyword[0]==_T('B'))
{
if(pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
if(pStep->GetBaseType()==0)
{
pStep->SetBaseType(1);
2026-10-04 00:04:20 +08:00
adsout<<_T("<基线居右>");
2026-09-28 15:28:50 +08:00
}
else if(pStep->GetBaseType()==1)
{
pStep->SetBaseType(2);
2026-10-04 00:04:20 +08:00
adsout<<_T("<基线居中>");
2026-09-28 15:28:50 +08:00
}
else
{
pStep->SetBaseType(0);
2026-10-04 00:04:20 +08:00
adsout<<_T("<基线居左>");
2026-09-28 15:28:50 +08:00
}
pStep->downgradeOpen();
}
else if(sKeyword[0]==_T('F'))
{
if(pStep->upgradeOpen()!=Acad::eOk)
return RTERROR;
pStep->Reverse();
pStep->downgradeOpen();
}
}
OPENOBJ_END();
return RTNORM;
}