本帖最后由 Gaudi 于 2024-4-25 02:44 编辑
第二篇 第二部分 读取主线起点并计算起点角度
要加点强度了,这一部分我开始涉及到vla函数。
前文说到vla函数本质上是将cad中的图元转变为大佬微软建立的com平台上。
那么这里就涉及到指向和转变的函数。
你得先跟电脑说,我要将这个东西转一下吧?
我最常用的就两个,其他碰到需求再说:
<entsel>和<entlast>。
<entsel>意思是entity select的意思,实体选择。
<entlast>意思是entity last的意思,最近一次创造的实体。
其他你先别看。
不管是自己选、还是电脑选,选中了以后,通过<VLAX-ENAME->VLA-OBJECT>,即可转变为vla实体。
还是得通过<setq>定义一下,你转变了不定义,接下来也没法调用是吧?
照样给个示例:
- (setq OBJCenterLine (VLAX-ENAME->VLA-OBJECT centerLine))
这就把通过<entsel>获得的centerLine,转变为vla实体OBJCenterLine了。
转变为VLA实体有什么好处呢?
前文说过,三种情况:
A 各软件之间数据的连接必须用
B 相比传统办法更加简单清晰
C 传统办法不能达成需求
1 获得起点坐标
这次就是B情况。
给大家看看用VLA函数怎么获得起点。
- (setq starPoint (VLAX-CURVE-GETSTARTPOINT OBJCenterLine))
好了。
好了?
好了。
不用去判断是多段线还是SPL线,不需要用各种循环啥的。
反正我是因为查过,所以才不想用了。
并且vla函数有个特点,你别看它长,其实它很软。
它能干啥都给你写得清清楚楚。
VLAX-CURVE-GETSTARTPOINT
定义- 曲线 -获得 起始 点
简直把大爷来用啊写在脸上了。
2 求得起点的切线角度
要想进行下一步标注,得求得起点处垂直曲线的角度。
而垂直曲线的角度,可以通过这个点切点角度换算。
所以问题转化为求得曲线起点的切线。
首先第一个函数,<VLAX-CURVE-GETPARAMATPOINT>。(定义-曲线-获得 参数 在 点)
这个函数的解释很晦涩,我仔细理解以后发现:
这不就是<VLAX-ENAME->VLA-OBJECT>吗?
只不过是将曲线和点结合起来而已。
【叠甲:这只是个人的、错误的理解】
然后获得点的VLA对象以后,再使用<VLAX-CURVE-GETFIRSTDERIV>。(定义-曲线-获得 一阶 导数)
这返回的是一个向量。
切线嘛,肯定是一个有指向性的参数。
最终的结果是:
- (setq V1 (VLAX-CURVE-GETFIRSTDERIV ENAME (VLAX-CURVE-GETPARAMATPOINT ENAME Point)))
在切点加上返回的向量,就得到切线了!
这里要用到一个运算函数<mapcar>。
照样给个实例:
- (mapcar '1+ '(10 11 12))
返回(11 12 13)。
<mapcar> 函数后面要再跟一个函数,这是<mapcar>定义需求得。
最后的结果是:
- (setq P1 (MAPCAR '+ Point V1))
打上<'>,作用是将 + 符号作为一个函数名传递给 MAPCAR,而不是对 + 进行求值。
通过使用单引号 ',告诉 AutoLISP 将 + 作为一个符号(函数名)原封不动地传递给 MAPCAR,而不对其进行求值。
这样,MAPCAR 就知道要使用 + 函数来处理列表中的元素。
因此,(MAPCAR '+ Point V1) 的作用是将 Point 与 V1 列表中对应位置的元素相加,生成一个新的点 P1。
这实现了将点 Point 沿着向量 V1 的方向进行平移的功能。
然后,将这个平移后的点,赋值给P1。
那么P1和point,就组成了Point这个点的切线。
结束。
3 总结
有点绕晕了啊……
再总结下。
A 将主线转为VLA对象。<VLAX-ENAME->VLA-OBJECT>
B 获取主线的起始点。<VLAX-CURVE-GETSTARTPOINT>
C 将起始点和曲线结合起来。<VLAX-CURVE-GETPARAMATPOINT>
D 获得起始点的一阶导数,也就是切线向量。<VLAX-CURVE-GETFIRSTDERIV>
E 将起始点沿着切线向量移动。(MAPCAR '+ Point V1)
F 获得切点角度。(setq pointAngle (ANGLE Point P1))
还是挺顺畅的。
就我个人感觉,VLA函数麻烦的不是使用,而是……
根本不知道有这个函数啊!
也不知道这个函数能干啥啊!
但是用起来是真爽啊,简单清晰,接近自然语言了。
毕竟都给封装好了。
4 代码实现
- (DEFUN angleCAL (ENAME Point)
- (setq V1 (VLAX-CURVE-GETFIRSTDERIV ENAME (VLAX-CURVE-GETPARAMATPOINT ENAME Point)))
- (setq P1 (MAPCAR '+ Point V1))
- (setq pointAngle (ANGLE Point P1))
- pointAngle
- )
这个代码还可以满足其他需求。
比如画切线啊什么的。
反正已经拿到两个点了。
|