找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 3402|回复: 15

[教学] 实用函数C:CAL

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-10-11 10:55:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 st788796 于 2014-10-11 11:03 编辑

节选自 Help 手册

p1 p2 ... 为 lisp 变量
1 计算两点单位矢量
(c:cal "vec1(p1,p2)")

2 两点间矢量
(c:cal "vec(p1,p2)") => (mapcar '- p2 p1)

3 计算直线上点
pltpld 函数在给定的直线上返回一点。点在直线上的位置可以通过它与第一点之间的距离指定,也可以通过参数 t 参数化确定。

pld(p1,p2,dist)计算通过点 p1p2 的直线上的一个点。参数 dist 定义该点到点 p1 的距离。

plt(p1,p2,t)计算通过点 p1p2 的直线上的一个点。参数 t 定义该点在直线上的以参数表示的位置。

以下是参数 t 的样例: (此处 t 的意义与 AcGeLineSeg 的 interval 意义一致, lowerBound 0.0, upperBound 1.0)
如果 t=0,则所求点为 p1
如果 t=0.5,则所求点为 p1 和 p2 之间的中点
如果 t=1,则所求点为 p2

4 rot 函数绕坐标轴旋转点并返回旋转得到的点。

rot(p,origin,ang)以经过原点Z 轴为轴,旋转点 p,旋转角度为 ang ,如下例所示:


rot(p,AxP1,AxP2,ang)以经过点 AxP1 和点 AxP2 的直线为轴旋转点 p,转角为 ang,如下例所示。轴的方向为从第一个点到第二个点。


5 illilp 函数可以确定交点。

ill(p1,p2,p3,p4) =〉 (inters p1 p2 p3 p4) 确定两条直线 (p1、p2) 和 (p3、p4) 的交点。所有点都被认为是三维点。

ilp(p1,p2,p3,p4,p5)确定直线(通过 p1、p2)和平面(通过三点 p3、p4、p5)的交点。


6 两点间距离
dist(p1,p2)确定点 p1p2 之间的距离。此函数相当于矢量表达式 abs(p1-p2)

dpl(p,p1,p2)确定点 p 到直线(通过点 p1p2)的最短距离。

dpp(p,p1,p2,p3)确定点 p 到平面(由三点 p1、p2、p3 定义)的距离。


7 计算法向矢量(Normal)

nor 函数用于计算单位法向矢量(即与直线或平面垂直的矢量),而不是某个点。矢量定义法线的方向而不是空间中的位置。可将法向矢量加到一个点上以获得另一个点。

nor确定选定的圆、圆弧或多段线弧段的三维单位法向矢量。此法向矢量是选定对象的对象坐标系 (OCS) 的 Z 轴。

nor(v)确定矢量 v 的二维单位法向矢量。这两个矢量都被认为是二维的,且投影在当前 UCS 的 XY 平面上。得出的法向矢量的方向指向原矢量 v 的左边。

nor(p1,p2)确定直线 p1,p2 的二维单位法向矢量。该直线的方向为从 p1 指向 p2。得出的法向矢量的方向为指向原直线 (p1、p2) 的左边。

nor(p1,p2,p3)确定平面(由 p1、p2p3 三点定义)的三维单位法向矢量。法向矢量的方向与给定三点的逆时针方向垂直。


评分

参与人数 1D豆 +5 贡献 +1 收起 理由
xshrimp + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-10-11 11:04:19 | 显示全部楼层
可以直接使用cal函数,调用cal之前需先加载geomcal.arx
  1. (if (null cal) (arxload "geomcal.arx"))

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-10-11 11:14:17 | 显示全部楼层
本帖最后由 st788796 于 2014-10-11 11:42 编辑
牢固 发表于 2014-10-11 11:04
可以直接使用cal函数,调用cal之前需先加载geomcal.arx
2015 不是 ARX 了,是  geomcal.crx

  1. (if (not (member "GEOMCAL.ARX" (mapcar 'strcase (arx))))
  2.   (arxload (findfile "geomcal.arx"))
  3. )

点评

好像2014就是.crx 终于找到答案了。。 感谢  详情 回复 发表于 2014-10-11 14:00
我目前使用的最高版本是2013,,2015没尝试过!  详情 回复 发表于 2014-10-11 13:23
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 344个

财富等级: 日进斗金

发表于 2014-10-11 13:23:11 | 显示全部楼层
本帖最后由 牢固 于 2014-10-11 13:24 编辑
st788796 发表于 2014-10-11 11:14
2015 不是 ARX 了,是  geomcal.crx

我目前使用的最高版本是2013,,2015没尝试过!{:soso_e114:}crx和arx有何区别?

点评

A的小蜜的名字C开头。  详情 回复 发表于 2014-10-11 14:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 146个

财富等级: 日进斗金

发表于 2014-10-11 14:00:24 | 显示全部楼层
st788796 发表于 2014-10-11 11:14
2015 不是 ARX 了,是  geomcal.crx

好像2014就是.crx   终于找到答案了。。  感谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-10-11 14:06:02 | 显示全部楼层
我在05版下测试(cal "vec1(p1,p2)") (C:cal "vec1(p1,p2)")一样的,不用加载(arxload (findfile "geomcal.arx")。04版下不行。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-10-11 14:34:10 | 显示全部楼层
牢固 发表于 2014-10-11 13:23
我目前使用的最高版本是2013,,2015没尝试过!crx和arx有何区别?

A的小蜜的名字C开头。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-10-11 15:34:09 | 显示全部楼层
将函数进行到底,不去学头痛的几何了!{:soso_e100:}
  1. ;;两点的单位向量
  2. ;;(c:cal "vec1([0,0,0],v)")向量的单位向量
  3. (defun vec:normalize (p1 p2)
  4.   (c:cal "vec1(p1,p2)")
  5. )
  6. ;;向量长度
  7. (defun vec:length (v)
  8.   (c:cal "abs(v)")
  9. )
  10. ;;两向量夹角
  11. ;;三点夹角(c:cal "ang(pb,p1,p2)")
  12. (defun vec:angle (v1 v2)
  13.   (c:cal "ang([0,0,0],v1,v2)")
  14. )
  15. ;;向量在平面上投影角度
  16. ;;(c:cal "ang(pbas,p1,p2,normal)")三点形式
  17. (defun vec:angleonplane        (v1 v2 normal)
  18.   (c:cal "ang([0,0,0],v1,v2,normal)")
  19. )

待续.....

评分

参与人数 1D豆 +2 收起 理由
/db_自贡黄明儒_ + 2 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-10-11 15:48:44 | 显示全部楼层
本帖最后由 st788796 于 2014-10-11 15:51 编辑

继续
  1. ;;弧度转度
  2. (defun r2d (d) (c:cal "r2d(d)"))
  3. ;;度转弧度
  4. (defun d2r (d) (c:cal "d2r(d)"))
  5. ;;四舍五入
  6. (defun round (d) (c:cal "round(d)"))
  7. ;;反正弦
  8. (defun asin (d) (c:cal "asin(d"))
  9. ;;反余弦
  10. (defun acos (d) (c:cal "acos(d)"))
  11. ;;直线p1 p2 与平面p3 p4 p5 交点
  12. (defun line:intersplane        (p1 p2 p3 p4 p5)
  13.   (c:cal "ilp(p1,p2,p3,p4,p5)")
  14. )

评分

参与人数 1D豆 +5 贡献 +1 收起 理由
xshrimp + 5 + 1 很给力!经验;技术要点;资料分享奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-10-11 16:01:02 | 显示全部楼层
继续
  1. ;;两点间向量(mapcar '- p1 p2)
  2. (defun vec:p2p (p1 p2) (c:cal "vec(p1,p2)"))
  3. ;;向量的垂向量(单位向量)
  4. (defun vec:perpvector (v) (c:cal "nor(v)"))
  5. ;;两点的垂向量
  6. (defun vec:2perpvector (p1 p2)
  7.   (c:cal "nor(p1,p2)")
  8. )
  9. ;;平面的法线向量
  10. (defun plane:normal (p1 p2 p3)
  11.   (c:cal "nor(p1,p2,p3)")
  12. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-10-11 16:16:21 | 显示全部楼层
继续
  1. ;;点到直线最短距离(abs (car (trans (mapcar '- p p1) 0 (mapcar '- p2 p1))))
  2. (defun pnt:p2ldist (p p1 p2)
  3.   (c:cal "dpl(p,p1,p2)")
  4. )
  5. ;;点到平面(p1,p2,p3)的最短距离
  6. (defun pnt:disttoplane (p p1 p2 p3)
  7.   (c:cal "dpp(p,p1,p2,p3)")
  8. )
  9. ;;两点之中点
  10. (defun midp (p1 p2)
  11.   (c:cal "plt(p1,p2,0.5)")
  12. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-10-11 16:48:23 | 显示全部楼层
真是很棒的源码和设计思路很赞!:)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-10-11 17:33:46 | 显示全部楼层
继续
  1. ;;点绕平面某一点旋转,注意角度为十进制角度
  2. (defun pnt:rotate (p p0 an)
  3.   (c:cal "rot(p,p0,an)")
  4. )
  5. ;;点绕直线轴旋转(三维)
  6. (defun pnt:rotatebyline        (p p1 p2 an)
  7.   (c:cal "rot(p,p1,p2,an)")
  8. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-10-11 17:38:32 | 显示全部楼层
最后一个表达式计算

_$ (c:cal "5*4+6/(3-5)")
17.0
_$

其他用法如捕捉运算、坐标运算、标准函数等用 Alisp 函数更易读和直接
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8731个

财富等级: 富甲天下

发表于 2014-10-11 17:53:03 | 显示全部楼层
感谢 st788796 分享程序!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-5-2 00:45 , Processed in 0.491505 second(s), 57 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表