ARX测试_绘制道路横断面

news2024/12/22 18:40:17

本文迁移自本人网易博客,写于2011年1月12日,ARX测试_绘制道路横断面 - lysygyy的日志 - 网易博客 (163.com)

1、已提供道路的图形,获取用户输入的两点,并在两点间画一条虚线。

计算这条直线与多少条直线相交,若数量不等于7,提示用户,非二板块道路并返回。

//获取用户输入点

ads_point pt1, pt2;

if (acedGetPoint(NULL, "请选择一个点:", pt1) != RTNORM)

{

return;

}

//以第一点为基点,从用户处获得第二点

if (acedGetPoint(pt1, "请选择一个点:", pt2) != RTNORM)

{

return;

}

//创建直线

AcDbLine *pLine = new AcDbLine(asPnt3d(pt1), asPnt3d(pt2));

//设置线性为虚线

char linetype[30];

strcpy(linetype, "DASHED");

AcDbLinetypeTable *pLinetypeTbl;

AcDbObjectId ltId;

acdbCurDwg()->getLinetypeTable(pLinetypeTbl, AcDb::kForRead);

if ((pLinetypeTbl->getAtlinetype, ltId)) != Acad::eOk)

{

pLinetypeTbl-> close();

acdbCurDwg()-> loadLineTypeFile(linetype, "acadiso.lin");

acdbCurDwg()-> getLinetypeTable(pLinetypeTbl, AcDb::kForRead);

pLinetypeTbl-> getAt(linetype, ltId);

}

pLinetypeTbl-> close();

pLine-> setLinetype(ltId);

//将虚线添加到当前数据库中

AcDbObjectId objId;

postToDatabase(pLine, objId);

//计算这条直线与多少条直线相交,并且这些直线都互相平行

//将图形中凡是与虚线相交的直线添加到组中

//创建新组

AcDbGroup *pGroup = new AcDbGroup();

//将新组添加到组字典中

AcDbDictionary *pGroupDict;

acdbHostApplicationServices()->workingDatabase()->getGroupDictionary(pGroupDict, AcDb::kForWrite);

AcDbObjectId goupId;

pGroupDict->setAt("grouptest", pGroup, groupId);

pGroupDict->close();

pGroup->close();

AcDbBlockTable pBlockTbl;

acDbHostApplicationServices()->workingDatabase()->getSymbolTable(pBlockTbl, AcDb::kForRead);

AcDbBlockTableRecord *pBlockRecord;

if (pBlockTbl->getAt(ACDB_MODEL_SPACE,

pBlockTableRecord, AcDb::kForRead) == Acad::eOk)

{

pBlockTbl->close();

AcDbObject *pObj;

AcDbBlockTableRecordIterator *pIter = pBlockRecord->newIterator();

AcGePoint3dArray pointArray;

AcDbLine *pTempLine;

int i = 0;

while (!pIter->done())

{

pIter->getObject(pObj, AcDbForRead);

if (pObj->isKindOf(AcDbLine::desc())

{

//判断当前直线是否与虚线相交

AcGePoint3dArray tempArray;

pLine->intersectWith(pObj, AcDb::kOnBothOperands, tempArray) ;

if (!tempArray->isEmpty())

{

//判断当前直线是否与上一直线平行,即当前直线与上一条直线是否没有交点

if (i == 0)

{

pTempLine = pObj->copy();

}

else if (i > 0)

{

AcGePoint3dArray tempArray1;

pTempLine->intersectWith(pObj, AcDb::kOnBothOperands, tempArray1) ;

if (!tempArray1->isEmpty())

{

return;

}

pointArray->append(tempArray[i]);

pGroup->append(pObj->objectId());

pointArray[i]

pObj->close();

pTempLine =

i++;

}

}

}

else

{

pObj->close();

return;

}

pTempLine->close();

pBlockRecord->close();

pGroup->close();

//若组中实体数量不等于7,返回

if (pGroup->count() != 7)

{

return;

}

2、获取虚线与道路的交点(x坐标最小的,排序坐标点,若虚线是Y轴方向的,判断Y的大小),从该坐标点画一条粗直线,与道路线垂直。

double x;

AcGePoint3d firstPoint;

AcGePoint3dArray sortArray;

for (int i = 0; i < pointArray->length(); i ++)

{

int x1 = pointArray[i][X];

for (int j = i; j < pointArray->length(); j++)

{

if (i = j)

{

x = x1;

firstPoint = pointArray[j];

}

else

{

if (x > x1)

{

x = x1;

firstPoint = pointArray[j];

}

}

}

sortArray[i] = firstPoint;

}

//若交点数量不等于7,返回

int length = pointArray->length();

if(length != 7)

{

return;

}

//交点坐标排序后,删除最中间的点

pointArray->removeAt(length / 2);

//画一个圆,求得另外一个交点(垂足)

firstPoint = pointArray[0];

AcGePoint3d lastPoint = pointArray[length - 1];

double pX = lastPoint[X] - firstPoint[X];

double pY = lastPoint[Y] - firstPoint[Y];

AcGePoint3d centerPoint = {pX, pY, 0.0);

AcDbCircle *pCircle = new AcDbCircle();

pCircle->setCenter(centerPoint);

double r = sqrt(pX * pX / 4 + pY *pY / 4);

pCircle->setRadius(r);

AcDbObjectId ocircleId;

//将实体圆添加到块表记录中

postToDatabase(pCircle, ocircleId);

//新建一个组,将各平行线排序

//新建组的代码略,只写关键代码

//找到经过最后一个点的直线,并求圆与该直线的交点(不包含在交点数组中的点)

AcDbGroupIterator *pIter = pGroup->newIterator();

AcDbObject *pObj;

AcDbLine *pLastline;

for (; !pIter->done(); pIter->next())

{

pIter->getObject(pObj, AcDb::kForRead);

//判断lastPoint是否在该直线上

AcGePoint3dArray tempArray2;

lastPoint->intersectWith(pObj, AcDb::kOnBothOperands, tempArray2);

if (!tempArray2->isEmpty())

{

pLastLine = pObj->copy();

pObj->close();

}

}

//求圆与最后一条直线的交点

AcGePoint3d endPoint;

AcGePoint3dArray tempArray3;

pLastLine->intersectWith(pCircle, AcDb::kOnBothOperands, tempArray3);

if (tempArray3->length() < 2)

{

return;

}

if (tempArray3[0][X] == lastPoint[X] && tempArray3[0][Y] == lastPoint[Y])

{

endPoint = tempArray3[1];

}

else

{

endPoint = tempArray3[0];

}

//延伸法线(延伸长度为5),并获取到起点和终点,画粗直线

double d = 5.0;

double x1 = firstPoint[X];

double y1 = firstPoint[Y];

double x2 = endPoint[X];

double y2 = endPoint[Y];

double k = (y1 - y2) / (x1 - x2);

double b1 = y1 - k * x1;

double a = (k*k + 1);

double b = -2 * (x1 + k * y1 - k * b1);

double c = x1 * x1 + (y1 - b1) * (y1 - b1) - d * d;

double m = b * b - 4 * a * c;

if ( m < 0)

{

return;

}

double x3 = ( - b + sqrt(m)) / 2 / a;

double x4 = ( - b - sqrt(m)) / 2 / a;

double firstx;

if ( x3 > x1 && x3 > x2 || x3 < x1 && x3 < x2)

{

firstx = x3;

}

else

{

firstx = x4;

}

double firsty = k * firstx + b1;

AcGePoint3d Point1 = {firstx, firsty, 0.0);

//同样方法求得Point2,略

AcGePoint3d Point2;

//画粗直线

AcDbLine *pNewLine = new AcDbLine(Point1, Point2);

AcDbObjectId objId;

//将实体添加到块表记录中

postToDatabase(pNewLine, objId);

//将粗直线与组中各直线的交点写入一个数组中,并排序,略

AcGePoint3dArray ptArray;

//将各段距离写入一个double型数组中

double dArray[5];

for (int i = 0; i < 5; i++)

{

dArray[i] = acutDistance(ptArray[i], ptArray[i + 1]);

}

//获取用户输入的横断面名称,横断面名称必须不多于2个字符

string str;

bool flag = false;

while (!flag)

{

if (acedGetString(2, "请输入横断面名称(不多于2个字符):", &str) != RTNORM)

{

if (str == "")

{

AfxMessageBox("输入字符不能为空!");

}

else if ( str.length() > 2)

{

AfxMessageBox("名称不能多于2个字符!");

}

else if (FALSE == 遍历图形实体,判断是否有扩展数据与输入名称相同的)//没有相同名称

{

flag = TRUE;

}

}

}

}

//遍历图形中实体,判断扩展数据是否与输入的横断面名称相同

LPCTSTR szAppName = "RNAME";

TCHAR* pszRetDat;

AcDbBlockTableRecordIterator *pIterator = new AcDbBlockTableRecordIterator;

pBlockRec->newIterator(pIterator);

for (; !pIterator->done(); pIterator->step)

{

pIterator->getObject(pObj, AcDb::kForRead);

//得到指定对象、指定应用名下的扩展数据(DXF1000处)

GetXData1000(pObj, szAppName, &pszRetDat);

if (pszRetDat == str)

{

return TRUE;//名称相同

}

}

return FALSE;

//获取第一个文本的位置坐标,距离粗直线3

AcGePoint3d textPoint1;

int x1 = textPoint1[X];

int y1 = textPoint[Y];

int a = - 1 / k;

int b = y1 - a * x1;

//根据求延伸点的方法求出点坐标,略

//获取第二个文本的位置坐标,与上同,略;

AcGePoint3d textPoint2;

//将粗直线的第一个端点坐标转换为WCS

struct resbuf to, from;

from.restype = RTSHORT;

from.resval.rint = 1;//UCS

to.restype = RTSHORT;

to.resval.rint = 0; //WCS

acedTrans(asDblArray(textPoint1), &from, &to, Adesk::kFalse, asDblArray(textPoint1));

//将粗直线的第二个端点坐标转换为WCS

acedTrans(asDblArray(textPoint2), &from, &to, Adesk::kFalse, asDblArray(textPoint2));

//绘制粗直线上的第一个端点处的文字

AcDbText *PText = new AcDbText;

pText->setTextString(str);

pText->setPosition(textPoint1);

pText->setRotation(acutAngle(Point1, textPoint1));

pText->setHeight(8);

//绘制粗直线上第二个端点处的文字,略

//擦除辅助圆,虚线与其相同,略

ads_name objName;

circleName = acdbGetAdsName(&objName, objId);

acdbEntDel(objName);

4、绘制多段线,并描绘出距离。

//用户输入多段线起点

ads_point basePoint;

if (acedGetPoint(NULL, "请选择横断面的基点:", basePoint) != RTNORM)

{

return;

}

//新建一个数组,将各端点坐标值放入其中

AcGePoint2dArray *newArray = new AcGePoint2dArray;

newArray->append(basePoint);

//找到第二个端点

AcGePoint2d (newPoint);

acutPolar(basePoint, -2, 5, newPoint);

newArray->append(newPoint);

//第3个点

acutPolar(newPoint, -1, 10, newPoint);

newArray->append(newPoint);

//第4个点,距离数组

acutPolar(newPoint, 0, distArray[0], newPoint);

newArray->append(newPoint);

//第5个点

acutPolar(newPoint, -1, 1, newPoint);

newArray->append(newPoint);

//第6个点

acutPolar(newPoint, 0, distArray[1], newPoint);

newArray->append(newPoint);

//第7个点

acutPolar(newPoint, 1, 1, newPoint);

newArray->append(newPoint);

//第8个点

acutPolar(newPoint, 0, distArray[2], newPoint);

newArray->append(newPoint);

//第9个点

acutPolar(newPoint, -1, 1, newPoint);

newArray->append(newPoint);

//第10个点

acutPolar(newPoint, 0, distArray[3], newPoint);

newArray->append(newPoint);

//第11个点

acutPolar(newPoint, 1, 1, newPoint);

newArray->append(newPoint);

//第12个点

acutPolar(newPoint, 0, distArray[4], newPoint);

newArray->append(newPoint);

//第13个点

acutPolar(newPoint, 1, 10, newPoint);

newArray->append(newPoint);

//第14个点

acutPolar(newPoint, 0.5, 5, newPoint);

newArray->append(newPoint);

//绘制多段线

AcDbPolyline *pPolyline = new AcDbPolyline;

//将数组中的点添加到多段线中

for (int i = 0; i < newArray->length(); i++)

{

pPolyline->addVertexAt(i, *newArray[i], 0);

}

//新建一个组,将多段线及后面创建的直线和文本全都添加到组中

pGroup->append(pPolyline);

//获取多段线下第一条横线的起点和终点

AcGePoint3d *startPoint, *endPoint;

acutPolar(newArray[0], -1, 20, startPoint);

acutPolar(newArray[newArray->length() - 1], -1, 20, endPoint);

//创建起点到终点的直线,并将其加入组中,略

//获取多段线下第二条横线的起点和终点,距离为30,并将其加入组中,略

//获取左边第一条垂直线的起点和终点

AcGePoint3d *topPoint = (basePoint[X], newArray[1][Y], 0);

startPoint = (topPoint[X], newArray[2][Y, 0);

acutPolar(topPoint, -1, 30, endPoint);

//获取左边第二条垂直线的起点和终点

topPoint = (basePoint[X], newArray[3][Y], 0);

startPoint = (topPoint[X], startPoint[Y], 0);

acutPolar(topPoint, -1, 20, endPoint);

//获取左边第三条垂直线的起点和终点

topPoint = (basePoint[X], newArray[5][Y], 0);

startPoint = (topPoint[X], startPoint[Y], 0);

acutPolar(topPoint, -1, 20, endPoint);

//获取左边第4条垂直线的起点和终点

topPoint = (basePoint[X], newArray[7][Y], 0);

startPoint = (topPoint[X], startPoint[Y], 0);

acutPolar(topPoint, -1, 20, endPoint);

//获取左边第5条垂直线的起点和终点

topPoint = (basePoint[X], newArray[9][Y], 0);

startPoint = (topPoint[X], starPoint[Y], 0);

acutPolar(topPoint, -1, 20, endPoint);

//获取最后一条垂直线的起点和终点

topPoint = (basePoint[X], newArray[11][Y], 0);

startPoint = (topPoint[X], startPoint[Y], 0);

acutPolar(topPoint, -1, 30, endPoint);

//设置第一段距离的文本,并将其添加到组中

//获取文本位置的基点

topPoint = ((newArray[1][X] + newArray[3][X]) / 2, newArray[0][Y], 0);

acutPolar(topPoint, -1, 17, basePoint);

//文本内容为textArray[0],创建文本实体的函数略

//设置第二段距离的文本

topPoint = ((newArray[3][X] + newArray[5][X]) / 2, newArray[0][Y], 0);

acutPolar(topPoint, -1, 17, basePoint);

//设置第3、4、5段距离的文本,与上同,略

//设置总长度的文本

topPoint = ((newArray[0][X] + newArray[newArray->length() - 1]) / 2, newArray[0][Y], 0);

acutPolar(topPoint, -1, 27, basePoint);

//设置横断面的名称,A1-A1,设置其文本为粗体,高度

acutPolar(topPoint, -1,50, basePoint);

//遍历组中所有实体添加扩展数据A1

addXdata(pObj, appName, str);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/141148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

振弦采集模块多通道专用寄存器

振弦采集模块多通道专用寄存器 多通道频率、温度值寄存器 51~58&#xff08; 0x33~0x3A&#xff09; 位 符号 值 描述 默认值 bit15:0 频率/温度值 0 单通道模块时&#xff0c;寄存器 51 内为频率值&#xff0c;寄存器 55 内为温度值 4 通道模块时&#xff0c;寄存器 51~54 内…

如何去学习PMP考试的《PMBOK》

首先&#xff0c;是PMP考试的核心教材&#xff1a;《PMBOK指南》&#xff0c;目前已经出道第七版了&#xff0c;大家如果有备考的需要要赶紧买一本来学习。 其次&#xff0c;是《汪博士解读PMP》&#xff0c;目前出到第6版&#xff0c;这本书是对PMBOK中各领域知识点的深入浅出…

机械臂速成小指南(二十一):几何雅可比矩阵

&#x1f468;‍&#x1f3eb;&#x1f970;&#x1f973;需要机械臂相关资源的同学可以在评论区中留言哦&#x1f916;&#x1f63d;&#x1f984;指南目录&#x1f4d6;&#xff1a;&#x1f389;&#x1f389;机械臂速成小指南&#xff08;零点五&#xff09;&#xff1a;机…

煤矿皮带跑偏撕裂智能检测算法 opencv

煤矿皮带跑偏撕裂智能检测算法能够通过pythonopencv深度学习技术实时监测运输皮带的状况&#xff0c;当监测到皮带出现撕裂跑偏时&#xff0c;立刻抓拍告警并中止皮带的运输。OpenCV基于C实现&#xff0c;同时提供python, Ruby, Matlab等语言的接口。OpenCV-Python是OpenCV的Py…

动态博客系统

Halo 是我折腾过的众多博客系统里面&#xff0c;最好、最容易上手的动态博客系统之一&#xff08; solo 也是&#xff09;&#xff0c;轻快&#xff0c;简洁&#xff0c;功能强大。 正文 上周末正在募集团队一起写算法题&#xff0c;群里讨论需要一个网站来存放文章&#xff…

C++ 语法基础课 习题6 —— 函数

文章目录例题1. 804.n的阶乘2. 805.x和y的最大值3. 808.最大公约数4. 811.交换数值5. 812.打印数字6. 813.打印矩阵7. 819.递归求阶乘8. 820.递归求斐波那契数列例题 1. 804.n的阶乘 Acwing 804.n的阶乘 #include<iostream> using namespace std;int fact(int n) {if(…

MFC高级控件RichEdit2.0的使用

MFC高级控件RichEdit的使用MFC高级控件RichEdit的使用MFC控件设置焦点&#xff0c;实现回车后编辑框内容清空&#xff0c;焦点停留在该编辑框内MFC高级控件RichEdit的使用 RichEdit控件&#xff0c;可以设置编辑框内不同的行、不同的段落有不同的字体、颜色。 效果如下&#xf…

Python--文件基本操作

文件的存储方式 在计算机中&#xff0c;文件是以 二进制的方式保存在磁盘上的 文本文件和二进制文件 文本文件 可以使用文本编辑软件查看本质上还是二进制文件二进制文件 保存的内容 不是给人直接阅读的&#xff0c;而是提供给其它软件使用的二进制文件不能使用 文件编辑软件…

NTN(一) 基本架构

R17将NTN纳入了3GPP规范&#xff0c;NTN是 non-terrestrial networks非地面网络缩写&#xff0c;通过卫星或无人机平台实现NR通信&#xff0c;在地面网络设备无法普及的地方&#xff0c;采用NTN覆盖&#xff0c;进一步提升覆盖范围。例如在沙漠、海洋等极限区域&#xff0c;采用…

TCP协议

TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09; TCP-数据格式 数据偏移 占4位&#xff0c;取值范围是0x0101~0x1111乘以4就是首部长度&#xff08;Header Length&#xff09; 保留 占6位&#xff0c;目前全为0 有些资料中&#xff0c…

虚幻C++ 关于怎么打印日志

虚幻C 关于怎么打印日志 先打开日志窗口认识一下! 这个就是日志窗口了&#xff01; 可以对信息进行过滤&#xff01; 也可以只显示某种日志&#xff01; 认识完界面了&#xff01;开始写代码啦&#xff01; 老规矩&#xff0c;先给一个入口函数&#xff01; #include &qu…

社交电商红利期,怎么抓住这一波自带流量

自拼多多依靠社交电商模式跃升为行业前三时&#xff0c;社交电商模式就被众多学者以及电商人士研究&#xff0c;过去一年&#xff0c;亚马逊、Starday、TikTok等跨境电商服务平台纷纷推出“直播”功能&#xff0c;试图跟上社交电商发展红利期&#xff0c;为平台抓取更多流量。而…

原生app开发技巧——底部导航栏动画效果按钮制作方法之采用photoshop制作gif动画-过渡动画关键帧

我们要做的效果是如下&#xff0c;就像这个app一样底部的每个菜单点击是有动画的&#xff1a; 此问题来源于我们的一位ui设计师他无法制作Lottie动画无法输出.json格式给到我们的安卓工程师&#xff0c;因此还有一种方法就是做个gif图&#xff0c;而这个目前他也不会只有给大家…

Mysql 索引 以及 SQL 优化 (自用笔记)

(笔记来源 https://www.bilibili.com/video/BV1Kr4y1i7ru?p88&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 3.索引 3.1索引的语法 3.1索引的性能分析 3.1.1查看SQL执行频率 增删改为主的SQL的一般不需要优化 查询居多的SQL则需要优化 3.1.2慢查询的日志 记录了超过…

蓝牙透传模块芯片的BLE和SPP有什么区别?如何理解

一、什么是蓝牙透传芯片 蓝牙透传芯片的BLE和SPP有什么区别&#xff1f;如何理解呢&#xff1f; 首先要明确几个关键词&#xff0c;蓝牙芯片&#xff0c;蓝牙透传&#xff0c;蓝牙BLE&#xff0c;以及蓝牙SPP 第一&#xff1a;蓝牙芯片的概念可以参见一下网上的说明&#xff…

内网渗透测试——内网渗透测试基础

1.内网基础知识 1.工作组 再局域网中将不同的计算机按照功能&#xff08;或部门&#xff09;分别列入不同的工作组。 加入创建工作组&#xff1a;点击桌面上的计算机图标&#xff0c;再弹出的快捷键菜单中选择属性&#xff0c;然后几次点击更改设置和更改按钮。再计算机名输…

计算机组成原理题目汇总

文章目录 计算机系统概述数据的表示和运算存储器系统指令系统中央处理器总线输入输出系统计算机系统概述 MIP CPI Tc Fc相关的各种运算。 计算机系统硬件组成有:运算器、控制器、存储器、输入设备、输出设备。 冯诺伊曼机的特点有: 包含…五个部分;以二进制代码表示程序和…

异步通信技术AJAX | AJAX实现搜索联想和自动补全

目录 一&#xff1a;AJAX实现搜索联想和自动补全 二&#xff1a;HTTP状态信息 一&#xff1a;AJAX实现搜索联想和自动补全 &#xff08;1&#xff09;实现的原理 &#xff08;1&#xff09;什么是搜索联想&#xff1f;自动补全&#xff1f; ①百度是一个很典型的代表。在百度…

易基因|DNA甲基化揭示肌痛性脑脊髓炎/慢性疲劳综合征在复发和恢复周期中的动态表观变化

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。2022年10月06日&#xff0c;《Int J Mol Sci》杂志发表题为“Dynamic Epigenetic Changes during a Relapse and Recovery Cycle in Myalgic Encephalomyelitis/Chronic Fatigue Syndrome”…

大数据挖掘课程案例资源介绍

大数据挖掘课程案例资源分为【基础】版&#xff0c;【进阶】版&#xff0c;不同阶段的课程难易程度不一样&#xff0c;对学生的基础知识掌握要求也不一样。 【基础】Python编程基础 通过学习本课程可掌握Python 开发环境的搭建、Python 基础入门、函数、面向对象编程、…