⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ydtcommands.cpp

📁 用于既有线纵坡拟合的工具,可以准确的通过最小二乘法拟合出具有最小抬落道量的坡度线
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -