// CWireDim.cpp: implementation of the CWireDim class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ACRX_DXF_DEFINE_MEMBERS(CWireDim,AcDbEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, AcDbProxyEntity::kEraseAllowed, ATS_WIREDIM, "ATS_WIREDIM,图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CWireDim::CWireDim() { m_bLeft = FALSE; m_nTextLength = 0.0; m_csDimContent = _T("abc"); } CWireDim::~CWireDim() { } void CWireDim::GetExtend(XPoint &ptLow, XPoint &ptUp) { ptUp = m_ptTextUp; ptLow = m_ptTextLow; } Adesk::Boolean CWireDim::subWorldDraw(AcGiWorldDraw *pWd) { AcDbText text; text.setPosition(m_ptStart); text.setHeight(m_nTextHeight);//*DocGetPScale() text.setTextString(m_csDimContent); text.setTextStyle(GetTextStyleId(m_csTextStyle)); text.setWidthFactor(m_nWidthFactor); text.setRotation(0); AcDbExtents extents; text.getGeomExtents(extents); AcGePoint3d pMax = extents.maxPoint(); AcGePoint3d pMin = extents.minPoint(); m_nTextLength = fabs(pMax[0] - pMin[0]) + 50; if(m_ptStart == m_ptWire){ AcGePoint3d ptText; ptText = m_ptStart; double nTextAngle = m_nWireAngle; if(nTextAngle < 0) nTextAngle = nTextAngle + 2*PI; else if(nTextAngle >= PI && nTextAngle <= 3*PI/2) // >= 180 <= 270 nTextAngle = nTextAngle - PI; else if(nTextAngle>PI/2 && nTextAngle<=PI) nTextAngle = nTextAngle + PI; else if(nTextAngle>3*PI/2 && nTextAngle<2*PI) nTextAngle = nTextAngle; if(nTextAngle <= PI/2){ ptText.x -= 100; ptText.y += 100; //距导线距离 } else{ ptText.x += 50; ptText.y += 100; //距导线距离 } text.setRotation(nTextAngle); ads_polar(asDblArray(ptText), nTextAngle + PI, m_nTextLength/2, asDblArray(ptText)); text.setPosition(ptText); text.getGeomExtents(extents); AcGePoint3d pMax = extents.maxPoint(); AcGePoint3d pMin = extents.minPoint(); m_ptTextLow = pMin; m_ptTextUp = pMax; text.worldDraw(pWd); AcDbPoint ptDb; ptDb.setPosition(m_ptStart); ptDb.worldDraw(pWd); } else{ m_ptEnd = m_ptStart; if(m_bLeft) m_ptEnd.x -= m_nTextLength; else m_ptEnd.x += m_nTextLength; AcGePoint3d ptArray[3] = {m_ptWire, m_ptStart, m_ptEnd, }; pWd->geometry().polyline(3, ptArray); AcGePoint3d ptText; if(m_bLeft) ptText = m_ptEnd; else ptText = m_ptStart; ptText.x += 50; ptText.y += 50; text.setPosition(ptText); text.getGeomExtents(extents); AcGePoint3d pMax = extents.maxPoint(); AcGePoint3d pMin = extents.minPoint(); m_ptTextLow = pMin; m_ptTextUp = pMax; text.worldDraw(pWd); //段斜线 XPoint pt1, pt2; double ang = ads_angle(asDblArray(m_ptWire), asDblArray(m_ptStart)); ang -= m_nWireAngle; if(ang < 0) ang += PI*2; if(ang > PI) ang -= PI; double angTmp(0.0); if(ang < PI && ang < PI/2) angTmp = m_nWireAngle + PI/4 + PI/2; else angTmp = m_nWireAngle + PI/4; ads_polar(asDblArray(m_ptWire), angTmp, m_nTextHeight/2, pt1); ads_polar(pt1, angTmp + PI, m_nTextHeight, pt2); AcGePoint3d ptArray2[2] = {pt1, pt2,}; pWd->geometry().polyline(2, ptArray2); } return Adesk::kTrue; } Acad::ErrorStatus CWireDim::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { assertReadEnabled(); gripPoints.append(m_ptWire); gripPoints.append(m_ptStart); gripPoints.append(m_ptEnd); return Acad::eOk; } Acad::ErrorStatus CWireDim::subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { if (indices.length()== 0 || offset.isZeroLength()) return Acad::eOk; //that's easy :-) assertWriteEnabled(); if (indices.length()> 1){ if(m_ptWire == m_ptStart && indices[0] != 2){ m_ptStart += offset; } else subTransformBy(AcGeMatrix3d::translation(offset)); return Acad::eOk; } if (indices[0] == 0) { m_ptWire += offset; return Acad::eOk; } else if(indices[0] == 1){ m_ptStart += offset; return Acad::eOk; } else if(indices[0] == 2){ m_ptEnd += offset; if(m_ptEnd.x > m_ptStart.x) m_bLeft = FALSE; else m_bLeft = TRUE; return Acad::eOk; } return Acad::eOk; } Acad::ErrorStatus CWireDim::subExplode(AcDbVoidPtrArray& entitySet) const { assertReadEnabled(); { AcDbText text; text.setPosition(m_ptStart); text.setHeight(m_nTextHeight);//*DocGetPScale() text.setTextString(m_csDimContent); text.setTextStyle(GetTextStyleId(m_csTextStyle)); text.setWidthFactor(m_nWidthFactor); text.setRotation(0); AcDbExtents extents; text.getGeomExtents(extents); AcGePoint3d pMax = extents.maxPoint(); AcGePoint3d pMin = extents.minPoint(); (double&)m_nTextLength = fabs(pMax[0] - pMin[0]) + 50; } AcDbObjectId idLayer=layerId(); AcDbText *text = new AcDbText; AcGePoint3d ptText; if(m_bLeft) ptText = m_ptEnd; else ptText = m_ptStart; ptText.x += 50; ptText.y += 50; text->setLayer(idLayer); text->setPosition(ptText); text->setHeight(m_nTextHeight);//*DocGetPScale() text->setRotation(0); text->setTextString(m_csDimContent); text->setTextStyle(GetTextStyleId(m_csTextStyle,database())); text->setWidthFactor(m_nWidthFactor); if(m_ptStart != m_ptWire){ entitySet.append(text); AcGePoint3d ptTmp = m_ptStart; if(m_bLeft) ptTmp.x -= m_nTextLength; else ptTmp.x += m_nTextLength; AcDbPolyline *pline = new AcDbPolyline; pline->addVertexAt(0, m_ptWire.convert2d(AcGePlane::kXYPlane)); pline->addVertexAt(1, m_ptStart.convert2d(AcGePlane::kXYPlane)); pline->addVertexAt(2, ptTmp.convert2d(AcGePlane::kXYPlane)); pline->setLayer(idLayer); entitySet.append(pline); //段斜线 AcDbLine *Line = new AcDbLine; XPoint pt1, pt2; double ang = ads_angle(asDblArray(m_ptWire), asDblArray(m_ptStart)); ang -= m_nWireAngle; if(ang < 0) ang += PI*2; if(ang > PI) ang -= PI; double angTmp(0.0); if(ang < PI && ang < PI/2) angTmp = m_nWireAngle + PI/4 + PI/2; else angTmp = m_nWireAngle + PI/4; ads_polar(asDblArray(m_ptWire), angTmp, m_nTextHeight/2, pt1); ads_polar(pt1, angTmp + PI, m_nTextHeight, pt2); Line->setStartPoint(pt1); Line->setEndPoint(pt2); Line->setLayer(idLayer); entitySet.append(Line); } else{ double nTextAngle = m_nWireAngle; if(nTextAngle < 0) nTextAngle = nTextAngle + 2*PI; else if(nTextAngle >= PI && nTextAngle <= 3*PI/2) nTextAngle = nTextAngle - PI; else if(nTextAngle>PI/2 && nTextAngle<=PI) nTextAngle = nTextAngle + PI; else if(nTextAngle>3*PI/2 && nTextAngle<2*PI) nTextAngle = nTextAngle; text->setRotation(nTextAngle); AcGePoint3d ptText; ptText = m_ptStart; if(nTextAngle <= PI/2){ ptText.x -= 100; ptText.y += 100; //距导线距离 } else{ ptText.x += 50; ptText.y += 100; //距导线距离 } ads_polar(asDblArray(ptText), nTextAngle + PI, m_nTextLength/2, asDblArray(ptText)); text->setPosition(ptText); entitySet.append(text); } return Acad::eOk; } Acad::ErrorStatus CWireDim::subTransformBy(const AcGeMatrix3d& xform) { assertWriteEnabled(); m_ptStart.transformBy(xform); m_ptWire.transformBy(xform); return Acad::eOk; } Acad::ErrorStatus CWireDim::dwgOutFields(AcDbDwgFiler* filer) const { assertReadEnabled(); Acad::ErrorStatus es; if ((es = AcDbEntity::dwgOutFields(filer)) != Acad::eOk) { return es; } Adesk::Int16 version = 1; filer->writeItem(version); filer->writePoint3d(m_ptWire); filer->writePoint3d(m_ptStart); filer->writePoint3d(m_ptEnd); filer->writeBool(m_bLeft); filer->writeDouble(m_nTextHeight); filer->writeDouble(m_nWidthFactor); filer->writeString((LPCTSTR)m_csDimContent); filer->writeString((LPCTSTR)m_csTextStyle); filer->writeDouble(m_nWireAngle); return filer->filerStatus(); } Acad::ErrorStatus CWireDim::dwgInFields(AcDbDwgFiler* filer) { assertWriteEnabled(); Acad::ErrorStatus es; if ((es = AcDbEntity::dwgInFields(filer)) != Acad::eOk) { return es; } // Object Version - must always be the first item. // Adesk::Int16 version; AcGePoint3d ptTmp; filer->readItem(&version); if (version > 1) return Acad::eMakeMeProxy; switch (version) { case 1: { filer->readPoint3d(&m_ptWire); filer->readPoint3d(&m_ptStart); filer->readPoint3d(&m_ptEnd); filer->readBool(&m_bLeft); filer->readDouble(&m_nTextHeight); filer->readDouble(&m_nWidthFactor); XString xsContent; ReadString(filer, xsContent); m_csDimContent = (const TCHAR*)xsContent; ReadString(filer, xsContent); m_csTextStyle = (const TCHAR*)xsContent; filer->readDouble(&m_nWireAngle); if(m_nTextHeight < 10) m_nTextHeight = m_nTextHeight * 100; break; } default: assert(false); } return filer->filerStatus(); } //******************************************************************************** // CMutiWireDim //******************************************************************************** ACRX_DXF_DEFINE_MEMBERS(CMutiWireDim,AcDbEntity, AcDb::kDHL_CURRENT, AcDb::kMReleaseCurrent, AcDbProxyEntity::kEraseAllowed, ATS_WIREDIM2, "ATS_WIREDIM2,图形无法解析, 请下载上华软件|网址: www.shanghuasoft.com"); CMutiWireDim::CMutiWireDim() :DIST(100) { m_iCount = 0; } CMutiWireDim::~CMutiWireDim() { } void CMutiWireDim::SetPointArray(XPointList &lstPt) { m_iCount = lstPt.Length(); for(int i=0;iisDragging()){ text.worldDraw(pWd); } return Adesk::kTrue; } Adesk::Boolean CMutiWireDim::worldText2(AcGiWorldDraw *pWd) { double longLength(0.0); for(int i=0;igeometry().polyline(2, ptArray); } ptText.y += DIST; ptLine.y += DIST; ptIns = ptText; if(!m_bLeft) ptIns.x += DIST; text.setPosition(ptIns); if(!pWd->isDragging()){ text.worldDraw(pWd); } } //绘制竖线 ptTmp.y += (m_nTextHeight*m_iCount + m_iCount*DIST*2);//*DocGetPScale() AcGePoint3d ptArray2[2] = {m_ptStart, ptTmp, }; pWd->geometry().polyline(2, ptArray2); return Adesk::kTrue; } Adesk::Boolean CMutiWireDim::subWorldDraw(AcGiWorldDraw *pWd) { if(m_bPredigest) worldText(pWd); else worldText2(pWd); //绘制引出线 AcGePoint3d ptArray[4] = {m_arrPtWire[0], m_arrPtWire[m_iCount-1], m_ptStart, m_ptEnd, }; pWd->geometry().polyline(4, ptArray); //绘制导线交点短斜线 m_ptWire = m_arrPtWire[m_iCount-1]; double ang = ads_angle(asDblArray(m_ptWire), asDblArray(m_ptStart)); ang -= m_nWireAngle; if(ang < 0) ang += PI*2; if(ang > PI) ang -= PI; double angTmp(0.0); if(ang < PI && ang < PI/2) angTmp = m_nWireAngle + PI/4 + PI/2; else angTmp = m_nWireAngle + PI/4; for(int i=0;igeometry().polyline(2, ptArray2); } return Adesk::kTrue; } Acad::ErrorStatus CMutiWireDim::subGetGripPoints(AcGePoint3dArray& gripPoints, AcDbIntArray& osnapModes, AcDbIntArray& geomIds) const { assertReadEnabled(); gripPoints.append(m_ptStart); gripPoints.append(m_ptEnd); return Acad::eOk; } Acad::ErrorStatus CMutiWireDim::subMoveGripPointsAt(const AcDbIntArray& indices, const AcGeVector3d& offset) { if (indices.length()== 0 || offset.isZeroLength()) return Acad::eOk; //that's easy :-) if (indices.length()> 1){ subTransformBy(AcGeMatrix3d::translation(offset)); return Acad::eOk; } assertWriteEnabled(); if (indices[0] == 0) { m_ptStart += offset; return Acad::eOk; } else if(indices[0] == 1){ m_ptEnd += offset; if(m_ptEnd.x > m_ptStart.x) m_bLeft = FALSE; else m_bLeft = TRUE; return Acad::eOk; } return Acad::eOk; } Acad::ErrorStatus CMutiWireDim::subExplode(AcDbVoidPtrArray& entitySet) const { assertReadEnabled(); { AcDbText text; text.setPosition(m_ptStart); text.setHeight(m_nTextHeight);//*DocGetPScale() text.setTextString(m_csDimContent); text.setTextStyle(GetTextStyleId(m_csTextStyle)); text.setWidthFactor(m_nWidthFactor); text.setRotation(0); AcDbExtents extents; text.getGeomExtents(extents); AcGePoint3d pMax = extents.maxPoint(); AcGePoint3d pMin = extents.minPoint(); (double&)m_nTextLength = fabs(pMax[0] - pMin[0]) + DIST; } AcDbObjectId idLayer=layerId(); AcGePoint3d ptTmp = m_ptStart; if(m_bLeft) ptTmp.x -= m_nTextLength; else ptTmp.x += m_nTextLength; AcDbPolyline *pline = new AcDbPolyline; pline->addVertexAt(0, m_arrPtWire[0].convert2d(AcGePlane::kXYPlane)); pline->addVertexAt(1, m_arrPtWire[m_iCount-1].convert2d(AcGePlane::kXYPlane)); pline->addVertexAt(2, m_ptStart.convert2d(AcGePlane::kXYPlane)); pline->addVertexAt(3, ptTmp.convert2d(AcGePlane::kXYPlane)); pline->setLayer(idLayer); entitySet.append(pline); double ang = ads_angle(asDblArray(m_arrPtWire[m_iCount-1]), asDblArray(m_ptStart)); ang -= m_nWireAngle; if(ang < 0) ang += PI*2; if(ang > PI) ang -= PI; double angTmp(0.0); if(ang < PI && ang < PI/2) angTmp = m_nWireAngle + PI/4 + PI/2; else angTmp = m_nWireAngle + PI/4; //绘制短斜线 for(int i=0;isetLayer(idLayer); line->setStartPoint(pt1); line->setEndPoint(pt2); entitySet.append(line); } if(m_bPredigest){ //简化 AcDbText *text = new AcDbText; AcGePoint3d ptText; if(m_bLeft) ptText = m_ptEnd; else ptText = m_ptStart; ptText.x += DIST; ptText.y += DIST; text->setLayer(idLayer); text->setPosition(ptText); text->setHeight(m_nTextHeight);//*DocGetPScale() text->setRotation(0); text->setTextString(m_csDimContent); text->setTextStyle(GetTextStyleId(m_csTextStyle,database())); text->setWidthFactor(m_nWidthFactor); entitySet.append(text); } else { AcGePoint3d ptText, ptLine, ptTmp, ptIns; if(m_bLeft){ ptText = m_ptEnd; ptLine = m_ptStart; } else{ ptText = m_ptStart; ptLine = m_ptEnd; } ptTmp = m_ptStart; ptText.y -= (DIST + m_nTextHeight);//*DocGetPScale() ptLine.y -= (DIST + m_nTextHeight);//*DocGetPScale() for(i=0;isetLayer(idLayer); text->setHeight(m_nTextHeight);//*DocGetPScale() text->setTextString(m_lstDimContent[i]); text->setTextStyle(GetTextStyleId(m_csTextStyle,database())); text->setWidthFactor(m_nWidthFactor); text->setRotation(0); ptText.y += (DIST + m_nTextHeight);//*DocGetPScale() ptLine.y += (DIST + m_nTextHeight);//*DocGetPScale() if(i != 0){//绘制横线,最底下的不画 AcDbLine *line2 = new AcDbLine; line2->setLayer(idLayer); line2->setStartPoint(ptText); line2->setEndPoint(ptLine); entitySet.append(line2); } ptText.y += DIST; ptLine.y += DIST; ptIns = ptText; if(!m_bLeft) ptIns.x += DIST; text->setPosition(ptIns); entitySet.append(text); } //绘制竖线 ptTmp.y += (m_nTextHeight*m_iCount + m_iCount*DIST*2);//*DocGetPScale() AcDbLine *line3 = new AcDbLine; line3->setLayer(idLayer); line3->setStartPoint(m_ptStart); line3->setEndPoint(ptTmp); entitySet.append(line3); } return Acad::eOk; } Acad::ErrorStatus CMutiWireDim::subTransformBy(const AcGeMatrix3d& xform) { assertWriteEnabled(); m_ptStart.transformBy(xform); for(int i=0;iwriteItem(version); filer->writePoint3d(m_ptStart); filer->writePoint3d(m_ptEnd); filer->writeInt16(val); for(int i=0;iwritePoint3d(m_arrPtWire[i]); } filer->writeBool(m_bLeft); filer->writeBool(m_bPredigest); filer->writeDouble(m_nTextHeight); filer->writeDouble(m_nWidthFactor); filer->writeString((LPCTSTR)m_csDimContent); filer->writeString((LPCTSTR)m_csTextStyle); filer->writeDouble(m_nWireAngle); for(i=0;iwriteString((LPCTSTR)csTmp); } return filer->filerStatus(); } Acad::ErrorStatus CMutiWireDim::dwgInFields(AcDbDwgFiler* filer) { assertWriteEnabled(); m_lstDimContent.RemoveAll(); Acad::ErrorStatus es; if ((es = AcDbEntity::dwgInFields(filer)) != Acad::eOk) { return es; } // Object Version - must always be the first item. // Adesk::Int16 version, val; AcGePoint3d ptTmp; filer->readItem(&version); if (version > 1) return Acad::eMakeMeProxy; switch (version) { case 1: { filer->readPoint3d(&m_ptStart); filer->readPoint3d(&m_ptEnd); filer->readInt16(&val); m_iCount = val; for(int i=0;ireadPoint3d(&ptTmp); m_arrPtWire.append(ptTmp); } filer->readBool(&m_bLeft); filer->readBool(&m_bPredigest); filer->readDouble(&m_nTextHeight); filer->readDouble(&m_nWidthFactor); XString xsContent; ReadString(filer, xsContent); m_csDimContent = (const TCHAR*)xsContent; ReadString(filer, xsContent); m_csTextStyle = (const TCHAR*)xsContent; filer->readDouble(&m_nWireAngle); for(i=0;ifilerStatus(); } void InitWireDim(BOOL bTrue) { if(bTrue) { CWireDim::rxInit(); CMutiWireDim::rxInit(); } else { deleteAcRxClass(CMutiWireDim::desc()); deleteAcRxClass(CWireDim::desc()); } }