#include "stdafx.h" ///////////////////////////////////////////////////////////// // 竖板对象类 ///////////////////////////////////////////////////////////// const Adesk::UInt8 TDbVertSlab::g_nVersion = 1; ACRX_DXF_DEFINE_MEMBERS(ATSVertSlab, ATSEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, 1, ATS_VERTSLAB, "ATS_VERTSLAB图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); IMPLEMENT_TENTBASE(TDbVertSlab); TDbVertSlab::TDbVertSlab() { m_nThickness = 0; m_nHeightS = m_nHeightE = 0; } TDbVertSlab::~TDbVertSlab() { } BOOL TDbVertSlab::IsValid() const { BOOL bRet = TDbEntity::IsValid(); if (!bRet) return bRet; bRet = (m_ptStart.Distance2d(m_ptEnd)>_DIST_SNAP && m_nThickness>_DIST_SNAP && m_nHeightS*m_nHeightE>_DIST_SNAP*_DIST_SNAP); // 起点高度和终点高度, 必须全>0或<0 return bRet; } Acad::ErrorStatus TDbVertSlab::subGetClassID(CLSID* pClsid) const { return Acad::eOk; } // 提供对格式刷的支持 void TDbVertSlab::CopyPropertiesFrom(AcDbEntity *pSrcEntity, unsigned gMatchFlag) { assertWriteEnabled(); TDbEntity::CopyPropertiesFrom(pSrcEntity, gMatchFlag); TDbVertSlab *pSrc = TDbVertSlab::cast(pSrcEntity); if (pSrc) { m_nThickness = pSrc->m_nThickness; m_bShow2d = pSrc->m_bShow2d; } } // 从DWG读入数据: Acad::ErrorStatus TDbVertSlab::dwgInFields (AcDbDwgFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbEntity::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((AcGePoint3d *)&m_ptStart); pFiler->readItem((AcGePoint3d *)&m_ptEnd); pFiler->readItem(&m_nThickness); pFiler->readItem(&m_nHeightS); pFiler->readItem(&m_nHeightE); pFiler->readItem(&m_bShow2d); return pFiler->filerStatus(); } Acad::ErrorStatus TDbVertSlab::dwgOutFields(AcDbDwgFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es = TDbEntity::dwgOutFields(pFiler); if (es != Acad::eOk) return es; pFiler->writeItem(g_nVersion); pFiler->writeItem((AcGePoint3d &)m_ptStart); pFiler->writeItem((AcGePoint3d &)m_ptEnd); pFiler->writeItem(m_nThickness); pFiler->writeItem(m_nHeightS); pFiler->writeItem(m_nHeightE); pFiler->writeItem(m_bShow2d); return pFiler->filerStatus(); } Acad::ErrorStatus TDbVertSlab::dxfInFields (AcDbDxfFiler* pFiler) { assertWriteEnabled(); Acad::ErrorStatus es = TDbEntity::dxfInFields(pFiler); if (es!=Acad::eOk) return es; if (!pFiler->atSubclassData(_T("TDbVertSlab"))) { return Acad::eBadDxfSequence; } double r1, r2, r3; int nFlag; XPoint pt1, pt2; Adesk::UInt32 fieldsFlags = 0; resbuf rb; while ((es == Acad::eOk) && ((es = pFiler->readResBuf(&rb)) == Acad::eOk)) { switch (rb.restype) { case AcDb::kDxfXCoord: pt1=rb.resval.rpoint; fieldsFlags |= 0x01; break; case AcDb::kDxfXCoord+1: pt2=rb.resval.rpoint; fieldsFlags |= 0x02; break; case AcDb::kDxfReal: r1=rb.resval.rreal; fieldsFlags |= 0x04; break; case AcDb::kDxfReal+1: fieldsFlags |= 0x08; r2 = rb.resval.rreal; break; case AcDb::kDxfReal+2: fieldsFlags |= 0x10; r3 = rb.resval.rreal; break; case AcDb::kDxfInt16: fieldsFlags |= 0x20; nFlag = rb.resval.rint; break; //fall through intentional 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(Acad::eMissingDxfField, _T("\nMissing DXF group code: 10")); return Acad::eMissingDxfField; } if (!(fieldsFlags & 0x02)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 11")); return Acad::eMissingDxfField; } if (!(fieldsFlags & 0x04)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 40")); return Acad::eMissingDxfField; } if (!(fieldsFlags & 0x08)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 41")); return Acad::eMissingDxfField; } if (!(fieldsFlags & 0x10)) { pFiler->setError(Acad::eMissingDxfField, _T("\nMissing DXF group code: 42")); return Acad::eMissingDxfField; } m_ptStart=pt1; m_ptEnd=pt2; m_nThickness=r1; m_nHeightS=r2; m_nHeightE=r3; if (fieldsFlags&0x20) m_bShow2d=nFlag; return pFiler->filerStatus(); } Acad::ErrorStatus TDbVertSlab::dxfOutFields(AcDbDxfFiler* pFiler) const { assertReadEnabled(); Acad::ErrorStatus es=TDbEntity::dxfOutFields(pFiler); assert(es == Acad::eOk); es = pFiler->writeItem(AcDb::kDxfSubclass,_T("TDbVertSlab")); assert(es == Acad::eOk); pFiler->writePoint2d(AcDb::kDxfXCoord, m_ptStart.AsAcGePoint2d()); pFiler->writePoint2d(AcDb::kDxfXCoord+1, m_ptEnd.AsAcGePoint2d()); pFiler->writeDouble(AcDb::kDxfReal, m_nThickness); pFiler->writeDouble(AcDb::kDxfReal+1, m_nHeightS); pFiler->writeDouble(AcDb::kDxfReal+2, m_nHeightE); pFiler->writeInt16(AcDb::kDxfInt16, m_bShow2d); return es; } // ----------------------------------------------------------------------- // Overriden functions for edit // to do: // 允许通过夹点改变边界 Acad::ErrorStatus TDbVertSlab::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { assertReadEnabled(); gripPoints.append(m_ptStart); gripPoints.append(m_ptEnd); return Acad::eOk; } // stretch points is diffrent from grep points, with no midpoint included Acad::ErrorStatus TDbVertSlab::subGetStretchPoints(AcGePoint3dArray & stretchPoints) const { assertReadEnabled(); stretchPoints.append(m_ptStart); stretchPoints.append(m_ptEnd); return Acad::eOk; } // Active when being rotated, scaled, moved, etc. Acad::ErrorStatus TDbVertSlab::subTransformBy(const AcGeMatrix3d& xform) { assertWriteEnabled(); TDbEntity::subTransformBy(xform); ((AcGePoint3d &)m_ptStart).transformBy(xform); ((AcGePoint3d &)m_ptEnd).transformBy(xform); return Acad::eOk; } // 功能: 夹点操作 Acad::ErrorStatus TDbVertSlab::subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { assertWriteEnabled(); XPoint vtOffset = *(XPoint *)&offset; vtOffset.z = 0; for (int i = 0; i < indices.length(); i++) { int idx = indices[i]; if (idx==0) { m_ptStart += vtOffset; m_ptEnd += vtOffset; } else if (idx==1) { m_ptEnd += vtOffset; } } Acad::ErrorStatus es = Acad::eOk; return es; } // 取得夹点说明 Acad::ErrorStatus TDbVertSlab::GetGripText(int i, CString &cs) const { Acad::ErrorStatus es = Acad::eOk; XString sInfo; if (i == 0) { sInfo << _T("平移起点"); } else { sInfo << _T("拉伸终点"); } cs = sInfo; return es; } // 功能: 夹点操作 // 状态: 有待完成修改相关墙体门窗的操作 Acad::ErrorStatus TDbVertSlab::subMoveStretchPointsAt( const AcDbIntArray& indices, const AcGeVector3d& offset) { int nCount = indices.length(); return subMoveGripPointsAt(indices, offset); } Acad::ErrorStatus TDbVertSlab::ExplodeOrDraw3d(XExplodeDraw &dc) const { assertReadEnabled(); // sg add 100926,支持竖板开洞,首先判断是否带有洞口信息 int nLength = GetHolesNum(); if (nLength > 0) { return Draw3dHole(dc); } XLine ln(m_ptStart, m_ptEnd); ln.SetElevation(0.0); XLine lnLeft = ln.Offset(-m_nThickness/2); XLine lnRight = ln.Offset(m_nThickness/2); lnLeft.StartPoint().z = lnRight.StartPoint().z = m_ptStart.z; lnLeft.EndPoint().z = lnRight.EndPoint().z = m_ptEnd.z; XLine lnLeftUp = lnLeft; XLine lnRightUp = lnRight; lnLeftUp.StartPoint().z += m_nHeightS; lnRightUp.StartPoint().z += m_nHeightS; lnLeftUp.EndPoint().z += m_nHeightE; lnRightUp.EndPoint().z += m_nHeightE; XPoly2D polyLeft(1), polyRight(1); polyLeft.AppendNode(lnLeft.StartPoint()); polyLeft.AppendNode(lnLeft.EndPoint()); polyLeft.AppendNode(lnLeftUp.EndPoint()); polyLeft.AppendNode(lnLeftUp.StartPoint()); polyRight.AppendNode(lnRight.StartPoint()); polyRight.AppendNode(lnRight.EndPoint()); polyRight.AppendNode(lnRightUp.EndPoint()); polyRight.AppendNode(lnRightUp.StartPoint()); dc.DrawShell(polyLeft, DList()); dc.DrawShell(polyRight, DList()); dc.DrawMesh(polyLeft, polyRight); return Acad::eOk; } // sg add 100927,三维绘制,支持竖板上带洞(截面拉伸) Acad::ErrorStatus TDbVertSlab::Draw3dHole(XExplodeDraw &dc) const { Acad::ErrorStatus es = Acad::eOk; // 获取起点、终点 AcGePoint3d ptStart = m_ptStart.AsAcGePoint3d(), ptEnd = m_ptEnd.AsAcGePoint3d(), ptUpStart = ptStart, ptUpEnd = ptEnd; ptUpStart.z += m_nHeightS; ptUpEnd.z += m_nHeightE; // 构造起点、终点所在面 AcGePlane plane(ptEnd, ptStart, ptUpStart); AcGeVector3d vec = plane.normal(); vec.normalize(); // 备份一分 AcGeVector3d vecSpare(vec); double dThick = m_nThickness * (-0.5); vec = vec * dThick; // 中心截面PLine线 ptStart += TVector3D(vec); ptEnd += TVector3D(vec); ptUpEnd += TVector3D(vec); ptUpStart += TVector3D(vec); TGGePoly2D polyElev(1); polyElev.AppendNode(ptStart); polyElev.AppendNode(ptEnd); polyElev.AppendNode(ptUpEnd); polyElev.AppendNode(ptUpStart); // 获得竖板上的开洞信息 TDPtrList lstHoles; GetAllHoles(lstHoles); // 将圆洞的轮廓离散 TDPtrList lstHolesTmp; int nLength = lstHoles.Length(); for (int i=0; iLength(); k++) { *(*pHoleOnSide)[k] += TVector3D(vec); } lstHolesTmp.Append(pHoleOnSide); } vecSpare.normalize(); vecSpare = vecSpare*m_nThickness; dc.DrawBody(polyElev, lstHolesTmp, TVector3D(vecSpare)); return es; } Acad::ErrorStatus TDbVertSlab::ExplodeOrDraw2d(XExplodeDraw &dc) const { if (m_bShow2d) { XLine ln(m_ptStart, m_ptEnd); ln.SetElevation(0.0); XLine lnLeft = ln.Offset(-m_nThickness/2); XLine lnRight = ln.Offset(m_nThickness/2); dc << lnLeft << lnRight << XLine(lnLeft.StartPoint(), lnRight.StartPoint()) << XLine(lnLeft.EndPoint(), lnRight.EndPoint()); // sg add 100926,支持竖板开洞 TDPtrList lstHoles; GetAllHoles(lstHoles); TADSGePoint3d ptStart, ptEnd; int nLength = lstHoles.Length(); for (int i=0; i dMax - _DIST_SNAP) { dMax = dDist; ptEnd = ptLoc; } if (dDist < dMin + _DIST_SNAP) { dMin = dDist; ptStart = ptLoc; } } } const TCHAR *TDbVertSlab::GetDefaultLayer() const { return NULL; } /* * * * * * * * * * 取 动 态 属 性 显 示 数 据 的 函 数 * * * * * * * * * */ void TDbVertSlab::GetTips(DList &lstInfo) const { lstInfo.Append(new TObjInfoUnit(_T("对象类型"), _T("竖板"))); lstInfo.Append(new TObjInfoUnit(_T("板厚"), Dist2Str(GetThickness()))); lstInfo.Append(new TObjInfoUnit(_T("起点标高"), Dist2Str(m_ptStart.z))); lstInfo.Append(new TObjInfoUnit(_T("终点标高"), Dist2Str(m_ptEnd.z))); lstInfo.Append(new TObjInfoUnit(_T("起点高度"), Dist2Str(m_nHeightS))); lstInfo.Append(new TObjInfoUnit(_T("终点高度"), Dist2Str(m_nHeightE))); lstInfo.Append(new TObjInfoUnit(_T("二维显示"), m_bShow2d? _T("开启") : _T("关闭"))); //lstInfo.Append(new TObjInfoUnit(_T("周长"), Dist2Str(GetPerimeter()))); //lstInfo.Append(new TObjInfoUnit(_T("底面积"), // XString(_T("%.2f"), _AS_SQMETER(GetBottomArea())))); //lstInfo.Append(new TObjInfoUnit(_T("侧面积"), // XString(_T("%.2f"), _AS_SQMETER(GetSideArea())))); lstInfo.Append(new TObjInfoUnit(_T("体积"), XString(_T("%.3f"), _AS_CUMETER(GetVolume())))); } BOOL TDbVertSlab::Is2DVisible() const { return m_bShow2d; } double TDbVertSlab::GetThickness() const { return m_nThickness; } double TDbVertSlab::GetHeightS() const { return m_nHeightS; } double TDbVertSlab::GetHeightE() const { return m_nHeightE; } XPoint TDbVertSlab::GetStartPoint() const { return m_ptStart; } XPoint TDbVertSlab::GetEndPoint() const { return m_ptEnd; } void TDbVertSlab::SetThickness(double h) { assertWriteEnabled(); m_nThickness = h; } void TDbVertSlab::SetHeightS(double s) { assertWriteEnabled(); m_nHeightS = s; } void TDbVertSlab::SetHeightE(double e) { assertWriteEnabled(); m_nHeightE = e; } void TDbVertSlab::Set2DVisible(BOOL bTrue) { assertWriteEnabled(); m_bShow2d=bTrue; } void TDbVertSlab::SetStartPoint(const XPoint &pt) { assertWriteEnabled(); m_ptStart=pt; } void TDbVertSlab::SetEndPoint(const XPoint &pt) { assertWriteEnabled(); m_ptEnd = pt; } // 工程量 double TDbVertSlab::GetPerimeter() const { XPoint ptS1=GetStartPoint()+GetHeightS(); XPoint ptE1=GetEndPoint()+GetHeightE(); double nDist1=GetStartPoint().Distance(GetEndPoint()) + GetHeightE() + ptS1.Distance(ptE1) + GetHeightS(); return nDist1; } double TDbVertSlab::GetBottomArea() const { double nVal=(GetHeightS()+GetHeightE())*GetStartPoint().Distance2d(GetEndPoint())/2.0; return nVal; } double TDbVertSlab::GetSideArea() const { return (GetPerimeter()*GetThickness()); } double TDbVertSlab::GetVolume() const { return (GetBottomArea()*GetThickness()); } // sg add 100925,支持竖板上开洞 // 如果是圆洞,dWidth为直径,dHeight为0 bool TDbVertSlab::AddHole(TADSGePoint3d ptLoc, double dWidth, double dHeight) { // 构造起点、终点所在面 AcGePoint3d ptStart = m_ptStart.AsAcGePoint3d(), ptEnd = m_ptEnd.AsAcGePoint3d(), ptUpStart = ptStart, ptUpEnd = ptEnd; ptUpStart.z += m_nHeightS; ptUpEnd.z += m_nHeightE; // 获得ptLoc投影到面上的投影点 AcGePlane plane(ptEnd, ptStart, ptUpStart); AcGePoint3d ptSpare = ptLoc.AsAcGePoint3d(), ptProject = ptSpare.orthoProject(plane); // 中心截面PLine线 TGGePoly2D polyElev(1); polyElev.AppendNode(ptStart); polyElev.AppendNode(ptEnd); polyElev.AppendNode(ptUpEnd); polyElev.AppendNode(ptUpStart); // 构造洞的PLine线 TGGePoly2D polyHole(1); GetHolePline(ptProject, dWidth, dHeight, polyHole); // 判断两个PLine线是否相交 int nLength1 = polyHole.TotalSegments(), nLength2 = polyElev.TotalSegments(); TADSGePoint3d ptInt1, ptInt2; for (int i=0; i &lstHoles) const { lstHoles.Reset(); assertReadEnabled(); const TEntityFields &fd = GetFields(); AcGePoint3d point; double dBulge = 0; Adesk::UInt8 bIsClosed = 0; // 逐个读取洞口轮廓线PLine线信息 long lNum = fd.GetSubFieldNum(); for (long l=0; lGetSubFieldNum(); if (lLength == 0) { continue; // 空集合 } // 构造一个洞口轮廓线 TGGePoly2D *pHole = new TGGePoly2D(1); pHole->Reset(); for (int i=0; iGetSubField(i); if (pointFd.GetDataType() != TEntityField::kGroup) { if (_tcscmp(pointFd.GetName(), _T("洞口线闭合")) != 0) { continue; // 洞口线点数 } pointFd.GetData(bIsClosed); pHole->SetFlag(bIsClosed); // 设置轮廓线闭合 continue; } // 取一个洞口轮廓线PLine线信息 TEntityFields *pointFds = NULL; pointFd.GetData(pointFds); if (pointFds->GetSubFieldNum() == 0) { continue; // 空集合 } pointFds->GFD(_T("点"), point); // 取点坐标 pointFds->GFD(_T("凸度"), dBulge); // 取Bulge值 pHole->AppendNode(TADSGePoint3d(point[0], point[1], point[2]), dBulge); } lstHoles.Append(pHole); } } // sg add 100926,增加洞口的动态数据 void TDbVertSlab::SetHolePLine(const TGGePoly2D &polyHole) { assertWriteEnabled(); TEntityFields &fd = Fields(); // 将一个洞口的数据,保存成一个TEntityField(组),存入动态数据 TEntityField *pHole = new TEntityField(_T(""), TEntityField::kGroup); fd.Add(pHole); TEntityFields *pNewFds = NULL; pHole->GetData(pNewFds); // 保存洞口轮廓线是否闭合 Adesk::UInt8 bIsClosed = polyHole.GetFlag(); pNewFds->SFD(_T("洞口线闭合"), bIsClosed); // 保存构成洞口轮廓线的点数 Adesk::UInt16 nVertexCount = polyHole.Length(); pNewFds->SFD(_T("洞口线点数"), nVertexCount); AcGePoint3d point; double dBulge = 0; for (long l=0; lAdd(pVertex); TEntityFields *pTempFds = NULL; pVertex->GetData(pTempFds); // 保存点坐标 point = polyHole.GetAt(l).AsAcGePoint3d(); pTempFds->SFD(_T("点"), point); // 保存Bulge值 dBulge = polyHole.GetBulge(l); pTempFds->SFD(_T("凸度"), dBulge); } } int EditVertSlab0(AcDbObjectId id); void InitDbVertSlab(BOOL bTrue) { AecObjectEditMethod pOldEdit=NULL; if (bTrue) { TDbVertSlab::rxInit(); pOldEdit=TDbVertSlab::SetEditMethod(EditVertSlab0); TDbVertSlab::InitMatchProtocol(TRUE); } else { TDbVertSlab::InitMatchProtocol(FALSE); TDbVertSlab::SetEditMethod(pOldEdit); deleteAcRxClass(TDbVertSlab::desc()); } } // Command:编辑竖板 int EditVertSlab0(AcDbObjectId id) { OPENOBJ_BEGIN(id, AcDb::kForRead, TDbVertSlab, pStep); if (!pStep) return RTERROR; //判断是不是上海城建梁实体 CString strCmdName(_T("")); TDbXDataMap map; map.Read(pStep, _T("TGZZCL")); map.GetAt(_T("cmdName"), strCmdName); if (strCmdName == _T("TGZZCLKL")|| strCmdName == _T("TGZZCLLL")|| strCmdName == _T("TGZZCLTL")|| strCmdName == _T("TGZZCLXL")) { struct resbuf rbUr; rbUr.restype = RTSTR; rbUr.resval.rstring = _tcsdup(_T("EditObj")); rbUr.rbnext = NULL; acedSetVar(_T("USERS3"), &rbUr); acedPostCommand(strCmdName); acedPostCommand(_T("\n")); return RTNORM; } else { while(1) { const TCHAR *szPrompt1=_T("\n选择 [起点标高(A)/起边高度(S)/终点标高(D)/终边高度(F)/开关二维(G)/板厚(H)]<退出>:"); XString sKeyword; int nRet=0; INITGET_BEG(0, _T("A S D F G H L")); nRet=ads_getkword(szPrompt1, sKeyword); INITGET_END(); if (nRet!=RTNORM) break; if (sKeyword[0]==_T('H')) { double nRailHeight=pStep->GetThickness(); nRet=GetReal(_T("\n板厚"), nRailHeight); if (nRet==RTCAN) break; if (nRet==RTNORM) { if (pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetThickness(nRailHeight); pStep->downgradeOpen(); } } else if (sKeyword[0]==_T('A')) { XPoint ptStart=pStep->GetStartPoint(); double nElev=ptStart.z; nRet=GetReal(_T("\n起点标高"), nElev); if (nRet==RTCAN) break; if (nRet==RTNORM) { ptStart.z = nElev; if (pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetStartPoint(ptStart); pStep->downgradeOpen(); } } else if (sKeyword[0]==_T('S')) { double h=pStep->GetHeightS(); nRet=GetReal(_T("\n起边高度"), h); if (nRet==RTCAN) break; if (nRet==RTNORM) { if (pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetHeightS(h); pStep->downgradeOpen(); } } else if (sKeyword[0]==_T('D')) { XPoint ptEnd=pStep->GetEndPoint(); double nElev=ptEnd.z; nRet=GetReal(_T("\n终点标高"), nElev); if (nRet==RTCAN) break; if (nRet==RTNORM) { ptEnd.z = nElev; if (pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetEndPoint(ptEnd); pStep->downgradeOpen(); } } else if (sKeyword[0]==_T('F')) { double h=pStep->GetHeightE(); nRet=GetReal(_T("\n终边高度"), h); if (nRet==RTCAN) break; if (nRet==RTNORM) { if (pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->SetHeightE(h); pStep->downgradeOpen(); } } else if (sKeyword[0]==_T('L')) { pStep->list(); } else if (sKeyword[0]==_T('G')) { BOOL bShow2d=pStep->Is2DVisible(); bShow2d = !bShow2d; if (bShow2d) adsout << _T("\n开启二维显示!"); else adsout << _T("\n关闭二维显示!"); if (pStep->upgradeOpen()!=Acad::eOk) return RTERROR; pStep->assertWriteEnabled(); pStep->Set2DVisible(bShow2d); pStep->downgradeOpen(); } } } OPENOBJ_END(); return RTNORM; }