#include "stdafx.h" #include "AecGripCback.h" //#include "KTSetting.h" #include "EarThwormDef.h" static const Adesk::UInt16 kColorByBlock = 0; static const Adesk::UInt16 kRed = 1; static const Adesk::UInt16 kYellow = 2; static const Adesk::UInt16 kGreen = 3; static const Adesk::UInt16 kCyan = 4; static const Adesk::UInt16 kBlue = 5; static const Adesk::UInt16 kMagenta = 6; static const Adesk::UInt16 kWhite = 7; static const Adesk::UInt16 kColorByLayer = 256; #define LAYER_DIM _T("LAY_CivDim") // Dim // 标注样式 #define DSTYLE_DIM _T("DSTYLE-1") // Dim using namespace AecGripCback; double PixelToWcs(int nPixel) { ads_point ptScreenSize; double nViewSize; struct resbuf rb1, rb2; acedGetVar(_T("ScreenSize"), &rb1); acedGetVar(_T("ViewSize"), &rb2); nViewSize = rb2.resval.rreal; ads_point_set(rb1.resval.rpoint, ptScreenSize); if (ptScreenSize[1] < 1.0e-6 || nViewSize < 1.0e-6) return 0.0; double hight = (nViewSize / ptScreenSize[Y]) * nPixel; return hight; } #if (ARX>16) const TCHAR* AecGripCback::GripToolTipFunc(AcDbGripData* pThis) { AecGripData* pAppData = (AecGripData*)pThis->appData(); if (pAppData->pOwner != NULL) { } return pAppData->szTip; } bool AecGripCback::WorldDrawfunc( AcDbGripData* pThis, AcGiWorldDraw* pWd, const AcDbObjectId& entId, AcDbGripOperations::DrawType type, AcGePoint3d* cursor, double dGripSize) { AcGePoint3d ptGe[5],ptBox[4]; AecGripData* pAppData = (AecGripData*)pThis->appData(); AcGePoint3d ptGrip = pAppData->ptGrip; //按 8 个像素点 int nColor = pWd->subEntityTraits().color(); pWd->subEntityTraits().setColor(pAppData->nColor); AcGiFillType eFill = pWd->subEntityTraits().fillType(); pWd->subEntityTraits().setFillType(kAcGiFillAlways); double dCmd = PixelToWcs(15); double dOne = PixelToWcs(1); double dTxth = 100.0; if (pAppData->ePos == eFlag || pAppData->ePos == eHitEdit )//节点造族中特殊显示,绘制旗帜 { dCmd *= 2; //像素点-->世界坐标系点 ptGe[0] = ptGrip; acedDwgPoint ptIn; ptIn[X] = ptGe[0].x;ptIn[Y] = ptGe[0].y;ptIn[Z] = ptGe[0].z; CPoint ptOut; acedCoordFromWorldToPixel(0, ptIn, ptOut); CPoint pt[4]; pt[0] = ptOut; pt[1] = pt[0];pt[1].y -= 10; pt[2] = pt[0];pt[2].x += 10; pt[3] = pt[0];pt[3].y += 10; acedDwgPoint ptWcs[4]; for (int k = 0;k < 4;k++) { acedCoordFromPixelToWorld(0, pt[k], ptWcs[k]); ptGe[k].x = ptWcs[k][X];ptGe[k].y = ptWcs[k][Y]; ptGe[k].z = ptWcs[k][Z]; } pWd->geometry().polygon(3,ptGe); ptGe[1] = ptGe[3]; pWd->geometry().polyline(2,ptGe); //pWd->geometry().circle(ptGe[0],dCmd,AcGeVector3d::kZAxis); pWd->subEntityTraits().setFillType(eFill); pWd->subEntityTraits().setColor(nColor); return true; } else if ( pAppData->ePos == eEdit)//修改 { dCmd *= 0.5; //水平 +字 //水平 dCmd *= 0.5; ptGe[0] = ptGrip; ptGe[0].x -= dCmd; ptGe[1] = ptGrip; ptGe[1].x += dCmd; ptBox[0] = ptGe[0]; ptBox[0].y -= dOne; ptBox[1] = ptGe[0]; ptBox[1].y += dOne; ptBox[2] = ptGe[1]; ptBox[2].y += dOne; ptBox[3] = ptGe[1]; ptBox[3].y -= dOne; pWd->geometry().polygon(4, ptBox); //绘制对角 ptGe[0].y += dOne; ptGe[1].y -= dOne; pWd->geometry().polyline(2, ptGe); ptGe[0].y -= 2 * dOne; ptGe[1].y += 2 * dOne; pWd->geometry().polyline(2, ptGe); } else if (pAppData->ePos == eAdjust0)//空间十字 { //水平 +字 //水平 dCmd *= 0.5; ptGe[0] = ptGrip; ptGe[0].x -= dCmd; ptGe[1] = ptGrip; ptGe[1].x += dCmd; ptBox[0] = ptGe[0]; ptBox[0].y -= dOne; ptBox[1] = ptGe[0]; ptBox[1].y += dOne; ptBox[2] = ptGe[1]; ptBox[2].y += dOne; ptBox[3] = ptGe[1]; ptBox[3].y -= dOne; pWd->geometry().polygon(4,ptBox); //垂直 ptGe[0] = ptGrip; ptGe[0].y += dCmd; ptGe[1] = ptGrip; ptGe[1].y -= dCmd; ptBox[0] = ptGe[0]; ptBox[0].x -= dOne; ptBox[1] = ptGe[0]; ptBox[1].x += dOne; ptBox[2] = ptGe[1]; ptBox[2].x += dOne; ptBox[3] = ptGe[1]; ptBox[3].x -= dOne; pWd->geometry().polygon(4,ptBox); //垂直 ptGe[0] = ptGrip; ptGe[0].z -= dCmd; ptGe[1] = ptGrip; ptGe[1].z += dCmd; ptBox[0] = ptGe[0]; ptBox[0].y -= dOne; ptBox[1] = ptGe[0]; ptBox[1].y += dOne; ptBox[2] = ptGe[1]; ptBox[2].y += dOne; ptBox[3] = ptGe[1]; ptBox[3].y -= dOne; pWd->geometry().polygon(4,ptBox); pWd->subEntityTraits().setFillType(eFill); pWd->subEntityTraits().setColor(nColor); } else if (pAppData->ePos >= eStart && pAppData->ePos <= eEnd)//[] { ptGe[0] = ptGrip; ptGe[0].x -= 4 * dOne; ptGe[1] = ptGrip; ptGe[1].x += 4 * dOne;; ptBox[0] = ptGe[0]; ptBox[0].y -= 4 * dOne; ptBox[1] = ptGe[0]; ptBox[1].y += 4 * dOne; ptBox[2] = ptGe[1]; ptBox[2].y += 4 * dOne; ptBox[3] = ptGe[1]; ptBox[3].y -= 4 * dOne; pWd->geometry().polygon(4,ptBox); } else if(pAppData->ePos == eCommand2)//Mid Cmd { //+字 //水平 dCmd *= 0.6; ptGe[0] = ptGrip; ptGe[0].x -= dCmd; ptGe[1] = ptGrip; ptGe[1].x += dCmd; ptBox[0] = ptGe[0]; ptBox[0].y -= dOne; ptBox[1] = ptGe[0]; ptBox[1].y += dOne; ptBox[2] = ptGe[1]; ptBox[2].y += dOne; ptBox[3] = ptGe[1]; ptBox[3].y -= dOne; pWd->geometry().polygon(4,ptBox); //垂直 ptGe[0] = ptGrip; ptGe[0].y += dCmd; ptGe[1] = ptGrip; ptBox[0] = ptGe[0]; ptBox[0].x -= dOne; ptBox[1] = ptGe[0]; ptBox[1].x += dOne; ptBox[2] = ptGe[1]; ptBox[2].x += dOne; ptBox[3] = ptGe[1]; ptBox[3].x -= dOne; pWd->geometry().polygon(4,ptBox); pWd->subEntityTraits().setFillType(eFill); pWd->subEntityTraits().setColor(nColor); } else if (pAppData->ePos >= eCommand0 && pAppData->ePos <= eCommand19)//+字 { //+字 //水平 dCmd *= 0.6; ptGe[0] = ptGrip; ptGe[0].x -= dCmd; ptGe[1] = ptGrip; ptGe[1].x += dCmd; ptBox[0] = ptGe[0]; ptBox[0].y -= dOne; ptBox[1] = ptGe[0]; ptBox[1].y += dOne; ptBox[2] = ptGe[1]; ptBox[2].y += dOne; ptBox[3] = ptGe[1]; ptBox[3].y -= dOne; pWd->geometry().polygon(4,ptBox); //垂直 ptGe[0] = ptGrip; ptGe[0].y += dCmd; ptGe[1] = ptGrip; ptGe[1].y -= dCmd; ptBox[0] = ptGe[0]; ptBox[0].x -= dOne; ptBox[1] = ptGe[0]; ptBox[1].x += dOne; ptBox[2] = ptGe[1]; ptBox[2].x += dOne; ptBox[3] = ptGe[1]; ptBox[3].x -= dOne; pWd->geometry().polygon(4,ptBox); pWd->subEntityTraits().setFillType(eFill); pWd->subEntityTraits().setColor(nColor); } else if (pAppData->ePos >= eDim0 && pAppData->ePos <= eDim2) { double dUnit = 1.0; struct resbuf rbU; acedGetVar(_T("INSUNITS"), &rbU); if (rbU.resval.rint == AcDb::kUnitsMeters) { dUnit = 0.001; } else if(rbU.resval.rint == AcDb::kUnitsDecimeters)//分米 { dUnit = 0.01; } else if(rbU.resval.rint == AcDb::kUnitsCentimeters)//厘米 { dUnit = 0.1; } AcGiTextStyle txtStyle; fromAcDbTextStyle(txtStyle, _T("Pipe_Dim")); struct resbuf rb; ads_point vtViewDir; acedGetVar(_T("VIEWDIR"),&rb); ads_point_set(rb.resval.rpoint,vtViewDir); AcGeVector3d vtNorm = asVec3d(vtViewDir); if (pAppData->nDimType == 0)//Line { AcGePoint3d ptFr = pAppData->ptDim[0]; AcGePoint3d ptTo = pAppData->ptDim[1]; AcGePoint3d ptPs = pAppData->ptGrip; //三维标注 double dLen = ptFr.distanceTo(ptTo); TCHAR szDim[256]; memset(szDim,0,sizeof(szDim)); _stprintf(szDim,_T("%.f"),dLen); AcGePoint3d ptDim[2],ptOn; AcGeLine3d ln3d(ptFr,ptTo); ptOn = ln3d.closestPointTo(ptPs); //尺寸线 AcGeVector3d vt = ptPs - ptOn; dLen = vt.length(); ptDim[0] = ptFr + vt; ptDim[1] = ptTo + vt; pWd->geometry().polyline(2,ptDim); //Sta侧斜线圆点 pWd->geometry().circle(ptDim[0],0.25 * dCmd,vtNorm); //End侧斜线 pWd->geometry().circle(ptDim[1],0.25 * dCmd,vtNorm); //Sta侧X线 vt.normalize(); vt *= (dLen + 1.5 * 100.0); ptDim[0] = ptFr + vt; ptDim[1] = ptFr; pWd->geometry().polyline(2,ptDim); //End侧X线 ptDim[0] = ptTo + vt; ptDim[1] = ptTo; pWd->geometry().polyline(2,ptDim); //标注文字,居中 AcGeVector3d vtDir = ptTo - ptFr; vtDir.normalize(); txtStyle.setTextSize(dTxth * dUnit); txtStyle.setXScale(0.75); AcGePoint2d pt1,pt2; txtStyle.extentsBox(szDim,Adesk::kFalse,-1,Adesk::kTrue,pt1,pt2); dLen = pt2.x - pt1.x; ptPs += 0.5 * dLen * vtDir; //vt.normalize(); //ptPs += vt * 50; GetDimDir(vtDir); pWd->geometry().text(ptPs,vtNorm,vtDir,szDim,-1,Adesk::kFalse,txtStyle); } else if (pAppData->nDimType == 1)//半径标注 { AcGePoint3d ptFr = pAppData->ptDim[0]; AcGePoint3d ptTo = pAppData->ptDim[1]; AcGePoint3d ptPs = pAppData->ptGrip; TCHAR szDim[256]; memset(szDim,0,sizeof(szDim)); _tcscpy(szDim,pAppData->szTip); AcGePoint3d ptDim[2]; ptDim[0] = ptFr; ptDim[1] = ptTo; pWd->geometry().polyline(2,ptDim); AcGeVector3d vtL = ptFr - ptTo; vtL.normalize(); vtL *= dTxth * 0.7 * dUnit; AcGeVector3d vtV = vtL; vtV.normalize(); vtV.rotateBy(PI / 2.0,vtNorm); vtV *= 41.67 * 0.7 * dUnit; ptGe[0] = ptFr; ptGe[1] = ptFr - vtL; ptGe[1] += vtV; ptGe[2] = ptGe[1] - 2.0 * vtV; ptGe[3] = ptGe[0]; pWd->geometry().polygon(4,ptGe); AcGeVector3d vtDir = ptTo - ptFr; vtDir.normalize(); txtStyle.setTextSize(dTxth * dUnit); txtStyle.setXScale(0.75); AcGePoint2d pt1,pt2; txtStyle.extentsBox(szDim,Adesk::kFalse,-1,Adesk::kTrue,pt1,pt2); double dLen = fabs(pt2.x - pt1.x); ptPs += 0.5 * dLen * vtDir; //vt.normalize(); //ptPs += vt * 50; GetDimDir(vtDir); pWd->geometry().text(ptPs,vtNorm,vtDir,szDim,-1,Adesk::kFalse,txtStyle); } else if (pAppData->nDimType == 2 || pAppData->nDimType == 4)//DN %%D 直径标注 { AcGePoint3d ptFr = pAppData->ptDim[0]; AcGePoint3d ptTo = pAppData->ptDim[1]; AcGePoint3d ptPs = pAppData->ptGrip; TCHAR szDim[256]; memset(szDim,0,sizeof(szDim)); _tcscpy(szDim,pAppData->szTip); AcGePoint3d ptDim[2]; ptDim[0] = ptFr; ptDim[1] = ptTo; if (pAppData->nDimType == 2) pWd->geometry().polyline(2,ptDim); AcGeVector3d vtL = ptFr - ptTo; vtL.normalize(); vtL *= dTxth * 0.7; AcGeVector3d vtV = vtL; vtV.normalize(); vtV.rotateBy(PI / 2.0,vtNorm); vtV *= 41.67 * 0.7 * dUnit; ptGe[0] = ptFr; ptGe[1] = ptFr - vtL; ptGe[1] += vtV; ptGe[2] = ptGe[1] - 2.0 * vtV; ptGe[3] = ptGe[0]; if (pAppData->nDimType == 2) pWd->geometry().polygon(4,ptGe); ptGe[0] = ptTo; ptGe[1] = ptTo + vtL; ptGe[1] += vtV; ptGe[2] = ptGe[1] - 2.0 * vtV; ptGe[3] = ptGe[0]; if (pAppData->nDimType == 2) pWd->geometry().polygon(4,ptGe); AcGeVector3d vtDir = ptTo - ptFr; vtDir.normalize(); txtStyle.setTextSize(dTxth * dUnit); txtStyle.setXScale(0.75); AcGePoint2d pt1,pt2; txtStyle.extentsBox(szDim,Adesk::kFalse,-1,Adesk::kTrue,pt1,pt2); double dLen = fabs(pt2.x - pt1.x); ptPs += 0.5 * dLen * vtDir; //vt.normalize(); //ptPs += vt * 50; GetDimDir(vtDir); pWd->geometry().text(ptPs,vtNorm,vtDir,szDim,-1,Adesk::kFalse,txtStyle); } else if (pAppData->nDimType == 3)//角度标注 { AcGePoint3d ptFr = pAppData->ptDim[0]; AcGePoint3d ptTo = pAppData->ptDim[1]; AcGePoint3d ptCen; AcGePoint3d ptMid = pAppData->ptGrip; TCHAR szDim[256]; memset(szDim,0,sizeof(szDim)); _tcscpy(szDim,pAppData->szTip); pWd->geometry().circularArc(ptFr,ptMid,ptTo); AcGeCircArc3d cirGe(ptFr,ptMid,ptTo); ptCen = cirGe.center(); //箭头 AcGeVector3d vtL = ptFr - ptCen; vtL.normalize(); AcGeVector3d vtV = vtL; vtV.rotateBy(PI / 2.0,vtNorm); vtV *= 41.67 * 0.7 * dUnit; vtL *= dTxth * 0.7 * dUnit; ptGe[0] = ptFr; ptGe[1] = ptFr - vtL; ptGe[1] += vtV; ptGe[2] = ptGe[1] - 2.0 * vtV; ptGe[3] = ptGe[0]; pWd->geometry().polygon(4,ptGe); vtL = ptTo - ptCen; vtL.normalize(); vtV = vtL; vtV.rotateBy(PI / 2.0,vtNorm); vtV *= 41.67 * 0.7 * dUnit; vtL *= dTxth * 0.7 * dUnit; ptGe[0] = ptTo; ptGe[1] = ptTo - vtL; ptGe[1] += vtV; ptGe[2] = ptGe[1] - 2.0 * vtV; ptGe[3] = ptGe[0]; pWd->geometry().polygon(4,ptGe); vtL = ptFr - ptCen; vtL.normalize(); ptFr += vtL * 1.5 * 100.0; vtL = ptTo - ptCen; vtL.normalize(); ptTo += vtL * 1.5 * 100.0; ptGe[0] = ptCen; ptGe[1] = ptFr; pWd->geometry().polyline(2,ptGe); ptGe[0] = ptCen; ptGe[1] = ptTo; pWd->geometry().polyline(2,ptGe); //文字 vtL = ptMid - ptCen; vtL.rotateBy(PI / 2.0,vtNorm); vtL.normalize(); vtL.negate(); GetDimDir(vtL); pWd->geometry().text(ptMid,vtNorm,vtL,szDim,-1,Adesk::kFalse,txtStyle); } pWd->subEntityTraits().setFillType(eFill); pWd->subEntityTraits().setColor(nColor); } return true; } void AecGripCback::GetDimDir(AcGeVector3d& vt1) { double dAngle = 0.0; if (vt1.isParallelTo(AcGeVector3d::kXAxis)) { return; } if (vt1.isParallelTo(AcGeVector3d::kYAxis)) { return; } if (vt1.x > 1.e-10 && vt1.y > 1.e-10) //I { return; } if (vt1.isCodirectionalTo(-AcGeVector3d::kZAxis)) { vt1.negate(); return; } if (vt1.x < 1.e-10 && vt1.y > 1.e-10) //II { dAngle = AcGeVector3d::kXAxis.angleTo(vt1,AcGeVector3d::kXAxis); dAngle += PI; vt1 = AcGeVector3d::kXAxis; vt1.rotateBy(dAngle,AcGeVector3d::kZAxis); return; } if (vt1.x < 1.e-10 && vt1.y < 1.e-10) //III==I { vt1.negate(); return; } if (vt1.x > 1.e-10 && vt1.y < 1.e-10) //IV==II { vt1.negate(); dAngle = AcGeVector3d::kXAxis.angleTo(vt1,AcGeVector3d::kXAxis); dAngle += PI; vt1 = AcGeVector3d::kXAxis; vt1.rotateBy(dAngle,AcGeVector3d::kZAxis); return; } } #endif