#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 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 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 &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; iisA(); 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; nm_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; n0; 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 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 osmode(_T("OSMODE"), OS_END); XPushMemVar 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 osmode(_T("OSMODE"), OS_END); XPushMemVar 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 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; }