📄 ydtcommands.cpp
字号:
//
// ObjectARX defined commands
#include "StdAfx.h"
#include "StdArx.h"
#include "geassign.h"
#include <math.h>
#define PRECISION 0.0001
#define LEFT 1
#define RIGHT -1
// *************************************************************
//
// 函数名 ChuizuToZx
// -----------------------------------------------------
// 功能描述:
// 求过直线外一点到直线的垂足点坐标
// -----------------------------------------------------
// 参数:
// double &dXchuizu,double &dYchuizu, 所求出的垂足点
// double dXout,double dYout, 直线外一点
// double dXstart,double dYstart, 直线起点
// double dXend,double dYend 直线终点
//
//
// ***************************************************************
void ConnectToExcel(CString strFileName);
void DisconnectExcel();
void ChuizuToZx(double &dXchuizu,double &dYchuizu,double dXout,double dYout,double dXstart,double dYstart,double dXend,double dYend)
{
double k=0.0;
double b=0.0;
if (fabs(dYstart-dYend)<PRECISION)
{
dXchuizu = dXout;
dYchuizu = (dYstart+dYend)/2;
}
else if (fabs(dXstart-dXend)<PRECISION)
{
dYchuizu = dYout;
dXchuizu = (dXstart+dXend)/2;
}
else
{
k = (dYend-dYstart)/(dXend-dXstart);
b = dYstart-dXstart*k;
dXchuizu = (dYout+dXout/k-b)/(k+1/k);
dYchuizu = k*(dYout+dXout/k-b)/(k+1/k)+b;
}
}
void createGroup(AcDbObjectIdArray &ObjIds,char *pGroupName)
{
AcDbGroup *pGroup = new AcDbGroup(pGroupName);
for (int k=0; k<ObjIds.length(); k++)
{
pGroup->append(ObjIds[k]);
}
AcDbDictionary *pDict ;
acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pDict,AcDb::kForWrite);
AcDbObjectId dictID;
pDict->setAt(pGroupName,pGroup,dictID);
pDict->close();
pGroup->close();
}
void DrawBZ(AcGePoint3d pt,double dAlpha,double dMile,double dDist,int nDirection)
{
//打开层表
AcDbLayerTableRecord *pLayerTableRecord;
AcDbObjectId LayerTabRecordId;
AcDbLayerTable *pLayerTable;
AcDbObjectId ltypeObjId;
acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTable,AcDb::kForWrite);
if(pLayerTable->getAt("XBMarker",LayerTabRecordId) != Acad::eOk)
{
pLayerTableRecord=new AcDbLayerTableRecord;
pLayerTableRecord->setName("XBMarker");
pLayerTable->add(LayerTabRecordId,pLayerTableRecord);
pLayerTableRecord->close();
}
pLayerTable->close();
AcDbPolyline *pNewPoly = NULL;
pNewPoly = new AcDbPolyline;
//////////////////////////////////////////////////////////////////////////
//求四个角点坐标
AcGePoint2d pt1,pt2,pt3,pt4;
pt4.x = pt.x + cos(dAlpha-0.75*PI)*1.414*_fScale;
pt4.y = pt.y + sin(dAlpha-0.75*PI)*1.414*_fScale;
pt3.x = pt.x + cos(dAlpha+0.75*PI)*1.414*_fScale;
pt3.y = pt.y + sin(dAlpha+0.75*PI)*1.414*_fScale;
pt2.x = pt.x + cos(dAlpha+0.25*PI)*1.414*_fScale;
pt2.y = pt.y + sin(dAlpha+0.25*PI)*1.414*_fScale;
pt1.x = pt.x + cos(dAlpha-0.25*PI)*1.414*_fScale;
pt1.y = pt.y + sin(dAlpha-0.25*PI)*1.414*_fScale;
//中心点
AcGePoint2d ptTemp;
ptTemp.x = pt.x;
ptTemp.y = pt.y;
pNewPoly->addVertexAt(0,ptTemp);
//边界中心点
AcGePoint2d ptOut;
ptOut.x = pt.x + cos(dAlpha)*_fScale;
ptOut.y = pt.y + sin(dAlpha)*_fScale;
pNewPoly->addVertexAt(1,ptOut);
pNewPoly->addVertexAt(2,pt1);
pNewPoly->addVertexAt(3,pt2);
pNewPoly->addVertexAt(4,pt3);
pNewPoly->addVertexAt(5,pt4);
pNewPoly->addVertexAt(6,pt1);
pNewPoly->addVertexAt(7,ptOut);
ptOut.x = pt.x + cos(dAlpha)*17.0*_fScale;
ptOut.y = pt.y + sin(dAlpha)*17.0*_fScale;
pNewPoly->addVertexAt(8,ptOut);
pNewPoly->setLayer("XBMarker");
AddEntityToDbs(pNewPoly) ;
if (nDirection == TURN_LEFT)
{
ptOut.x = pt.x + cos(dAlpha)*2.0*_fScale;
ptOut.y = pt.y + sin(dAlpha)*2.0*_fScale;
//注里程
char cMile[128];
strcpy(cMile,LCchr(_strGH,dMile,_nJD));
AcGePoint3d ptTexPos;
ptTexPos.x = ptOut.x + cos(dAlpha+0.5*PI)*(0.5*_fScale);
ptTexPos.y = ptOut.y + sin(dAlpha+0.5*PI)*(0.5*_fScale);
maketext(ptTexPos,cMile,dAlpha,4.0*_fScale,_nColor,1,"standard","XBMarker");
//注距离
char cDist[128];
ads_rtos(dDist,2,2,cDist);
ptTexPos.x = ptOut.x + cos(dAlpha-0.5*PI)*(4.5*_fScale);
ptTexPos.y = ptOut.y + sin(dAlpha-0.5*PI)*(4.5*_fScale);
maketext(ptTexPos,cDist,dAlpha,4.0*_fScale,_nColor,1,"standard","XBMarker");
}
else
{
//注里程 先决定字体位置
char cMile[128];
strcpy(cMile,LCchr(_strGH,dMile,_nJD));
ptOut.x = pt.x + cos(dAlpha)*2.0*_fScale;
ptOut.y = pt.y + sin(dAlpha)*2.0*_fScale;
AcGePoint3d ptTexPos;
ptTexPos.x = ptOut.x + cos(dAlpha-0.5*PI)*(0.5*_fScale);
ptTexPos.y = ptOut.y + sin(dAlpha-0.5*PI)*(0.5*_fScale);
maketext(ptTexPos,cMile,dAlpha+PI,4.0*_fScale,_nColor,4,"standard","XBMarker");
//注距离
char cDist[128];
ads_rtos(dDist,2,2,cDist);
ptTexPos.x = ptOut.x + cos(dAlpha+0.5*PI)*(4.5*_fScale);
ptTexPos.y = ptOut.y + sin(dAlpha+0.5*PI)*(4.5*_fScale);
maketext(ptTexPos,cDist,dAlpha+PI,4.0*_fScale,_nColor,4,"standard","XBMarker");
}
}
void DrawBZ(AcGePoint3d pt,double dAlpha,double dMile,double dDist,double dDist2,int nDirection)
{
//打开层表
AcDbLayerTableRecord *pLayerTableRecord;
AcDbObjectId LayerTabRecordId;
AcDbLayerTable *pLayerTable;
AcDbObjectId ltypeObjId;
acdbHostApplicationServices()->workingDatabase()->getLayerTable(pLayerTable,AcDb::kForWrite);
if(pLayerTable->getAt("XBMarker",LayerTabRecordId) != Acad::eOk)
{
pLayerTableRecord=new AcDbLayerTableRecord;
pLayerTableRecord->setName("XBMarker");
pLayerTable->add(LayerTabRecordId,pLayerTableRecord);
pLayerTableRecord->close();
}
pLayerTable->close();
AcDbPolyline *pNewPoly = NULL;
pNewPoly = new AcDbPolyline;
//////////////////////////////////////////////////////////////////////////
//求四个角点坐标
AcGePoint2d pt1,pt2,pt3,pt4;
pt4.x = pt.x + cos(dAlpha-0.75*PI)*1.414*_fScale;
pt4.y = pt.y + sin(dAlpha-0.75*PI)*1.414*_fScale;
pt3.x = pt.x + cos(dAlpha+0.75*PI)*1.414*_fScale;
pt3.y = pt.y + sin(dAlpha+0.75*PI)*1.414*_fScale;
pt2.x = pt.x + cos(dAlpha+0.25*PI)*1.414*_fScale;
pt2.y = pt.y + sin(dAlpha+0.25*PI)*1.414*_fScale;
pt1.x = pt.x + cos(dAlpha-0.25*PI)*1.414*_fScale;
pt1.y = pt.y + sin(dAlpha-0.25*PI)*1.414*_fScale;
//中心点
AcGePoint2d ptTemp;
ptTemp.x = pt.x;
ptTemp.y = pt.y;
pNewPoly->addVertexAt(0,ptTemp);
//边界中心点
AcGePoint2d ptOut;
ptOut.x = pt.x + cos(dAlpha)*_fScale;
ptOut.y = pt.y + sin(dAlpha)*_fScale;
pNewPoly->addVertexAt(1,ptOut);
pNewPoly->addVertexAt(2,pt1);
pNewPoly->addVertexAt(3,pt2);
pNewPoly->addVertexAt(4,pt3);
pNewPoly->addVertexAt(5,pt4);
pNewPoly->addVertexAt(6,pt1);
pNewPoly->addVertexAt(7,ptOut);
ptOut.x = pt.x + cos(dAlpha)*25.0*_fScale;
ptOut.y = pt.y + sin(dAlpha)*25.0*_fScale;
pNewPoly->addVertexAt(8,ptOut);
pNewPoly->setLayer("XBMarker");
AddEntityToDbs(pNewPoly) ;
if (nDirection == TURN_LEFT)
{
ptOut.x = pt.x + cos(dAlpha)*2.0*_fScale;
ptOut.y = pt.y + sin(dAlpha)*2.0*_fScale;
//注里程
char cMile[128];
strcpy(cMile,LCchr(_strGH,dMile,_nJD));
AcGePoint3d ptTexPos;
ptTexPos.x = ptOut.x + cos(dAlpha+0.5*PI)*(0.5*_fScale);
ptTexPos.y = ptOut.y + sin(dAlpha+0.5*PI)*(0.5*_fScale);
maketext(ptTexPos,cMile,dAlpha,4.0*_fScale,_nColor,1,"standard","XBMarker");
//注距离
char cDist1[128],cDist2[128];
char *cDist;
ads_rtos(dDist,2,2,cDist1);
ads_rtos(dDist2,2,2,cDist2);
cDist = strcat(cDist2,",");
strcat(cDist,cDist1);
ptTexPos.x = ptOut.x + cos(dAlpha-0.5*PI)*(4.5*_fScale);
ptTexPos.y = ptOut.y + sin(dAlpha-0.5*PI)*(4.5*_fScale);
maketext(ptTexPos,cDist,dAlpha,4.0*_fScale,_nColor,1,"standard","XBMarker");
}
else
{
//注里程 先决定字体位置
char cMile[128];
strcpy(cMile,LCchr(_strGH,dMile,_nJD));
ptOut.x = pt.x + cos(dAlpha)*2.0*_fScale;
ptOut.y = pt.y + sin(dAlpha)*2.0*_fScale;
AcGePoint3d ptTexPos;
ptTexPos.x = ptOut.x + cos(dAlpha-0.5*PI)*(0.5*_fScale);
ptTexPos.y = ptOut.y + sin(dAlpha-0.5*PI)*(0.5*_fScale);
maketext(ptTexPos,cMile,dAlpha+PI,4.0*_fScale,_nColor,4,"standard","XBMarker");
//注距离
char cDist1[128],cDist2[128];
char *cDist;
ads_rtos(dDist,2,2,cDist1);
ads_rtos(dDist2,2,2,cDist2);
cDist = strcat(cDist1,",");
strcat(cDist,cDist2);
ptTexPos.x = ptOut.x + cos(dAlpha+0.5*PI)*(4.5*_fScale);
ptTexPos.y = ptOut.y + sin(dAlpha+0.5*PI)*(4.5*_fScale);
maketext(ptTexPos,cDist,dAlpha+PI,4.0*_fScale,_nColor,4,"standard","XBMarker");
}
}
//设置参数 比如绘图比例
void CS()
{
int nTemp = 1000;
acedGetInt("\n请指定标注比例 [1:n]: ",&nTemp);
if (nTemp<=0)
acedPrompt("\n 标注比例必须大于0,请重新输入");
else
_fScale = 1000.0/float(nTemp);
if (_fScale<=0.0)
{
acedPrompt("\n 标注比例不合法");
return;
}
//指定里程冠号
sprintf(_strGH,"");
if (ads_getstring(0,"\n请输入里程冠号: ",_strGH)!=RTNORM)
{
acedPrompt("\n未指定里程冠号,冠号为空");
}
acedGetInt("\n请指定标注颜色(1 红色,2 黄色,3 绿色,4 青色,5 蓝色,6 紫红色,7 黑或白,256 随层,0 随块,): ",&_nColor);
if (_nColor!=256 && (_nColor<0 ||_nColor>7))
{
acedPrompt("\n 未指定颜色,使用默认颜色(青色)");
}
acedGetInt("\n请指定小数位数,默认为0: ",&_nJD);
if (_nJD<0)
{
acedPrompt("\n小数位数不能为负,使用默认值");
_nJD= 0;
}
}
//指定线段
void XD()
{
//指定标注线段
//请指定线段起点
if (ads_getpoint(NULL,"\n请指定线段起点:",asDblArray(ptStart))!=RTNORM)
{
acedPrompt("\n未指定里程零点");
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -