📄 compublic.cpp
字号:
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 + -