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

📄 compublic.cpp

📁 在AUTOCAD环境下沿路线插入图块
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		return FALSE;
	}
	pNamedObj->close();//关闭有名对象字典
	//检测是否包含指定记录名
	if (pDict->has(SXRecordName) != Adesk::kTrue){
		pDict->close();//关闭对象字典
		return FALSE;
	}
	//删除指定记录名
	if (pDict->remove(SXRecordName) != Acad::eOk){
		pDict->close();//关闭对象字典
		return FALSE;
	}
	pDict->close();//关闭对象字典
	return TRUE;
}



/*##############################################
  #											   #
  #  几何计算函数  Modify 2002.4.10 by KFX     #
  #											   #
/*##############################################*/

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			求两直线交点
//|					GetLineJd()
//|
//| 输入参数:		ads_point pt1			第一直线起点坐标
//|					ads_point pt2			第一直线终点坐标
//|					ads_point pt3			第二直线起点坐标
//|					ads_point pt4			第二直线终点坐标
//|					ads_point &jd			返回交点坐标
//|					int bz					求交运算标志
//| 返回:			BOOL
//| 说明:			bz=0	为正常线段求交。
//|					bz=1	为两直线还求交。
//|					bz=2	为射线与线段求交。
//|					bz=3	为线段与直线相交。
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL GetLineJd(ads_point pt1,ads_point pt2,ads_point pt3,ads_point pt4,
			   ads_point &jd,int bz)
{	
	double k1,k2,b1,b2;

													//计算两直线方程
	k1 = (pt2[1] - pt1[1]) / (pt2[0] - pt1[0]);
	k2 = (pt4[1] - pt3[1]) / (pt4[0] - pt3[0]);

	b1 = pt1[1] - k1 * pt1[0]; 
	b2 = pt3[1] - k2 * pt3[0];

	jd[0] = (b2 - b1) / (k1 - k2);
	jd[1] = k2 * jd[0] + b2;
													//避免两直线垂直及水平的错误
	if (fabs(pt2[0] - pt1[0]) < PARTICLE) {
		jd[0] = pt2[0];jd[1] = k2 * jd[0] + b2;
	} 
	
	if (fabs(pt4[0] - pt3[0]) < PARTICLE) {
		jd[0] = pt4[0];jd[1] = k1 * jd[0] + b1;
	}

	if (jd[0] > INFINITY || jd[0] < -INFINITY ||	//判断数值是否合理
		jd[1] > INFINITY || jd[1] < -INFINITY ) return FALSE;

													//直线求交
	if (BOUND(jd[0],pt1[0],pt2[0]) && BOUND(jd[0],pt3[0],pt4[0]) && 
		BOUND(jd[1],pt1[1],pt2[1]) && BOUND(jd[1],pt3[1],pt4[1]) && bz == 0) return TRUE;

	else if (bz == 1) {
		if (k1 == k2) return FALSE;					//如果两直线平行
		return TRUE;
	}
													//射线与线段求交
	else if (BOUND(jd[0],pt3[0],pt4[0]) && BOUND (jd[1],pt3[1],pt4[1]) && 
		((jd[0] - pt1[0]) / (pt2[0] - pt1[0]) > 0 || (jd[1] - pt1[1]) / (pt2[1] - pt1[1]) > 0) && bz == 2)	return TRUE;

													//线段与直线相交
	else if (BOUND(jd[0],pt1[0],pt2[0]) && BOUND(jd[1],pt1[1],pt2[1]) && bz == 3) return TRUE; 

	return FALSE;
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			求过某点做一条直线的垂线,返回垂足
//|					GetPerPoint()
//|
//| 输入参数:		ads_point pt1			直线起点坐标
//|					ads_point pt2			直线终点坐标
//|					ads_point pt			线外点
//|					ads_point per			垂足
//|					int bz					标志位
//| 返回:			int   返回值	1为点在直线右侧		-1为在直线左侧,
//|									0为没有垂足			2为该点在线上
//| 说明:			bz=0	为点与直线。
//|					bz=1	为点与线段。
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int GetPerPoint(ads_point pt1,ads_point pt2,ads_point pt,ads_point &per,int bz)
{
	int temp = (pt1[0] - pt2[0] > PARTICLE) ? -1 : 1;	//确定直线矢量

	double k1,k2,b1,b2;
														//根据直线方程确定垂直关系
	k1 = tan(ads_angle(pt1,pt2));
	b1 = pt1[1] - k1 * pt1[0];

	k2 = tan(ads_angle(pt1,pt2) + PI / 2.0);
	b2 = pt[1] - pt[0] * k2;

	per[0] = (b2 -b1) / (k1 - k2);
	per[1] = k1 * per[0] + b1;
														//判断点是否在直线上
	if (fabs(per[0] - pt[0]) < PARTICLE && fabs(per[1] - pt[1]) < PARTICLE) return 2;

	if (fabs(pt1[0] - pt2[0]) < PARTICLE) {				
		per[1] = k2 * per[0] + b2;
		if (pt1[1] > pt2[1]) temp = -1;
	}
														//返回不垂足
	if (!(BOUND(per[0],pt1[0],pt2[0]) && BOUND(per[1],pt1[1],pt2[1])) && bz) return 0;

	if (pt[1] - PARTICLE > per[1] || fabs(pt[1] - per[1]) < PARTICLE &&
		pt[0] < per[0]) 	return (-temp);				

	else return temp;

}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			直线L外的一点P做直线L成一角度的直线M,返回所在直线L上的点
//|					GetAngPoint()
//|
//| 输入参数:		ads_point pt1			直线起点坐标
//|					ads_point pt2			直线终点坐标
//|					ads_point pt			线外点
//|					ads_point &per			垂足
//|					double angle			角度值
//|					int bz					标志位
//| 返回:			int   返回值	1为点在直线右侧		-1为在直线左侧,
//|									0为没有返回点		2为该点在线上
//| 说明:			bz=0	为点与直线。
//|					bz=1	为点与线段。
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
int  GetAngPoint(ads_point pt1,ads_point pt2,ads_point pt,ads_point &per,double angle,int bz)
{
	int temp = (pt1[0] - pt2[0] > PARTICLE) ? -1 : 1;		//确定直线矢量

	double k1,k2,b1,b2;
															//根据直线方程确定垂直关系
	k1 = tan(ads_angle(pt1,pt2));
	b1 = pt1[1] - k1 * pt1[0];
	k2 = tan(ads_angle(pt1,pt2) + angle);
	b2 = pt[1] - pt[0] * k2;

	per[0] = (b2 -b1) / (k1 - k2);
	per[1] = k1 * per[0] + b1;
															//判断点是否在直线上
	if (fabs(per[0] - pt[0]) < PARTICLE && fabs(per[1] - pt[1]) < PARTICLE) return 2;

	if (fabs(pt1[0] - pt2[0]) < PARTICLE){
		per[1] = k2 * per[0] + b2;
		if (pt1[1] > pt2[1]) temp = -1;
	}
	if (!(BOUND(per[0],pt1[0],pt2[0]) && BOUND(per[1],pt1[1],pt2[1])) && bz) return 0;
						
															//返回不垂足
	if (pt[1] - PARTICLE > per[1] || fabs(pt[1] - per[1]) < PARTICLE &&
		pt[0] < per[0]) 	return (-temp);

	else return temp;
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			根据直线上某点做与直线成一定夹角定长的线段的函数
//|					GetAngLine()
//|
//| 输入参数:		ads_point pt1			直线起点		
//|					ads_point pt2			终点
//|					double dist				距pt1点的距离
//|					int bz					标志位
//|					double PerAngle			与该直线的角度
//|					double PerLong			线段的长度
//|					ads_point &rePoint		返回线段端点(线外点)
//|					ads_point &Origin		返回线段端点(线上点)
//| 返回:			BOOL
//| 说明:			bz=1	为在直线的右侧
//|					bz=-1	为在直线的左侧
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL GetAngLine(ads_point pt1,ads_point pt2,double dist,
				int bz, double PerAngle,double PerLong,ads_point &rePoint,ads_point &Origin)
{
	int ttt = 1;
	double rAngle;

	rAngle = ads_angle(pt1,pt2);

	Origin[0] = pt1[0] + cos(rAngle) * dist;
	Origin[1] = pt1[1] + sin(rAngle) * dist;

	if (Origin[0] > INFINITY || Origin[0] < -INFINITY || 
		Origin[1] > INFINITY || Origin[1] < -INFINITY ) return FALSE;

	ads_polar(Origin,rAngle - bz * PerAngle,PerLong,rePoint);

	if (rePoint[0] > INFINITY || rePoint[0] < -INFINITY || 
		rePoint[1] > INFINITY || rePoint[1] < -INFINITY ) return FALSE;
	
	return TRUE;	
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			坐标变换
//|					CoorSwitch()
//|
//| 输入参数:		ads_point OriginBefor			之前坐标
//|					ads_point OriginBehind			变换后坐标
//|					double angle					旋转坐标角度
//|					ads_point pt					变换之前点
//|					ads_point &rpt					变换后的点
//| 返回:			BOOL
//| 说明:			bz=1	为在直线的右侧
//|					bz=-1	为在直线的左侧
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL CoorSwitch(ads_point OriginBefor,ads_point OriginBehind,double angle,
				ads_point pt,ads_point &rpt)
{
	double rC,tempAngle;

	rC = ads_distance(OriginBefor,pt);

	tempAngle = ads_angle(OriginBefor,pt);

	ads_polar(OriginBehind,angle+tempAngle,rC,rpt);

	return TRUE;
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			椭圆方程
//|					EllipsEquation()
//|
//| 输入参数:		ads_point ptOrigin			起点坐标
//|					ads_point ptXFix			为X轴的方向
//|					double EllA					长轴
//|					double EllB					短轴
//|					int iTurnBz					转向
//|					int iAmount					点的个数
//|					ads_point pt[]				返回的各个点的坐标
//| 返回:			BOOL
//| 说明:			iTurnBz=1	左转
//|					iTurnBz=-1	为在直线的左侧
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL EllipsEquation(ads_point ptOrigin,ads_point ptXFix,double EllA,double EllB,
					int iTurnBz,int iAmount,ads_point pt[])
{
	int gs;
	double x,y,angle; 
	ads_point temPt,Origin;

	Spoint(Origin,0.0,0.0,0.0);

	angle = ads_angle(ptOrigin,ptXFix);

	for (x = 0,gs = 0;x < (EllA + PARTICLE);x += EllA / iAmount,gs++) {

		y = sqrt(pow(EllB,2) - pow(EllB * x,2) / pow(EllA,2));
		
		if (x + PARTICLE > EllA) y = 0.0;
		
		Spoint(pt[gs],x,iTurnBz * y,0.0);
		
		if (CoorSwitch(Origin,ptOrigin,angle,pt[gs],temPt) != TRUE) return FALSE;

		Cpoint(pt[gs],temPt);
	}

	return TRUE;
}

BOOL GetLineEquation(ads_point pt1, ads_point pt2, double &k, double &b)
{
	if (pt2[0] - pt1[0] == 0.0000) 
	{
		k = 0.0;
		b = 0.0;
	}
	else if (pt2[1] - pt1[1] == 0.0000)
	{
		k = 0.0;
		b = pt2[1];
	}
	else
	{
		k = (pt2[1] - pt1[1]) / (pt2[0] - pt1[0]);
		b = pt1[1] - k * pt1[0];
	}
	return TRUE;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			求直线与椭圆交点
//|					LineJdEllipse()
//|
//| 输入参数:		double k		
//|					double a,
//|					double b,
//|					int iTurnBz,
//|					ads_point &pt
//| 返回:			BOOL
//| 说明:			不详
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL LineJdEllipse(double k,double a,double b,int iTurnBz,ads_point &pt)
{
	double x,y;
	x = sqrt(pow(a * b,2) / (b * b + pow(a * k,2)));
	y = sqrt(pow(b,2) - pow(b * x,2) / pow(a,2));
	Spoint(pt,x,iTurnBz * y,0.0);
	return 1;
}


/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			求角函数
//|					GetAngle()
//|
//| 输入参数:		ads_point pTop		顶点
//|					ads_point pt1		第一条边的端点
//|					ads_point pt2		第二条边的端点
//|					int bz				标注位
//| 返回:			double		返回弧度
//| 说明:			bz=	0为按边的顺序求角度(逆时针)
//|						1为求小于180度的角
//|						2为求大于180度的角
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
double GetAngle(ads_point pTop,ads_point pt1,ads_point pt2,int bz)
{
	double temp1,temp2,angle1,angle2;

	temp1 = ads_angle(pTop,pt1);
	temp2 = ads_angle(pTop,pt2);

	angle1 = fabs(temp1 - temp2);
	angle2 = 2 * PI - angle1;

	if (bz == 1) return (angle1 < angle2 ? angle1 : angle2);

	if (bz == 2) return (angle1 > angle2 ? angle1 : angle2);

	else return (temp1 - temp2);
}


double ConvertFWJ(double a)
{	
	double rTep;
	rTep = PI / 2 - a;
	if (rTep < 0)
		rTep += (2 * PI);
	else if (rTep >= (2 * PI))
		rTep -= (PI / 2);
	return rTep;
}

double ConvertPolar(double a)
{
	double rTep;
	rTep = PI / 2 - a;
	return rTep;
}


/*##############################################
  #											   #
  #  图层操作函数  Modify 2002.4.10 by KFX     #
  #											   #
/*##############################################*/

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//| 函数名:			创建新图层
//|					MakeNewLayer()
//|
//| 输入参数:		char* LayerName			创建图层名称
//|					int clor				层颜色
//|					char *cLineFile			线型文件
//|					char* cLineType			线型名
//| 返回:			BOOL
//| 说明:			创建新层
//| 举例:			略
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
BOOL MakeNewLayer(CString LayerName,int clor,char *cLineFile,char* cLineType)
{
	//1.获取数据库中指向有名层表指针
    AcDbLayerTable *pLayerTable;

    if (acdbCurDwg()->
			getLayerTable(pLayerTable,AcDb::kForWrite) != Acad::eOk) {
		pLayerTable->close();//关闭层表指针
		return FALSE;
	}

	//2.建立一个新的层表
	AcDbObjectId ltypeObjId;
	if (!pLayerTable->has(LayerName)) {
		AcDbLayerTableRecord *pLayerTableRecord = new AcDbLayerTableRecord;
		pLayerTableRecord->setName(LayerName);

		AcCmColor color;			//定义层表颜色
		color.setColorIndex(clor);
		pLayerTableRecord->setColor(color);

		//新建立层表中的线形表
		AcDbLinetypeTable *pLinetypeTbl;

		if (acdbCurDwg()->
			getLinetypeTable(pLinetypeTbl,AcDb::kForRead) != Acad::eOk)
		{
			pLayerTable->close();						//关闭层表指针
			pLayerTableRecord->close();					//关闭层表记录指针
			return FALSE;
		}

		if ((pLinetypeTbl -> getAt(cLineType,ltypeObjId))!=Acad::eOk)
		{
			pLinetypeTbl -> close();
			
			if (acdbCurDwg()->
				loadLineTypeFile(cLineType,cLineFile) != Acad::eOk) {
				ads_printf("\n错误:不能加载%s线形文件!\n",cLineFile);
				pLayerTable->close();					//关闭层表指针
				pLayerTableRecord->close();
				return FALSE;
			}
			
			if (acdbCurDwg()->
				getLinetypeTable(pLinetypeTbl,AcDb::kForRead) != Acad::eOk) {
				ads_printf("\n错误:获取线型表错误!\n");
				pLayerTable->close();					//关闭层表指针
				pLayerTableRecord->close();
				return FALSE;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -