Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

624 lines
13 KiB
C++

#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