找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: cable2004

[求助] 已知:弧线求面AO-AC的nor

[复制链接]

已领礼包: 2226个

财富等级: 金玉满堂

 楼主| 发表于 2017-4-24 12:22:08 | 显示全部楼层
谢谢!我试试。
cad版本低
没有错误: no function definition: ALIGN
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2017-4-24 12:49:24 来自手机 | 显示全部楼层
cable2004 发表于 2017-4-24 12:22

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-24 22:58:47 | 显示全部楼层

ARC的法线向量是V1
那么垂平面的法线向量V = V1 和 向量AO(单位)的叉积

AO的向量你可以用 (mapcar '- po pa)得到

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2017-4-24 23:27:01 | 显示全部楼层
本帖最后由 newer 于 2017-4-24 23:40 编辑

通用的向量计算函数

  1. ;;;-----------------------------------------------------------;;
  2. ;;; 两向量的叉积                                              ;;
  3. ;;; Vector Cross Product                                       ;;
  4. ;;; Args: u,v - vectors in R^3                                      ;;
  5. ;;;-----------------------------------------------------------;;
  6. (defun XD::Vec:vxv (u v)
  7.   (list
  8.     (- (* (cadr u) (caddr v)) (* (cadr v) (caddr u)))
  9.     (- (* (car v) (caddr u)) (* (car u) (caddr v)))
  10.     (- (* (car u) (cadr v)) (* (car v) (cadr u)))
  11.   )
  12. )
  13. ;;;-----------------------------------------------------------;;
  14. ;;; 单位向量                                                      ;;
  15. ;;; Unit Vector - Lee Mac                                     ;;
  16. ;;; Args: v - vector in R^n                                      ;;
  17. ;;;-----------------------------------------------------------;;
  18. (defun XD::VEC:Normalize (v)
  19.   ((lambda (n)
  20.      (if (equal 0.0 n 1e-14)
  21.        nil
  22.        (XD::VEC:v*s v (/ 1.0 n))
  23.      )
  24.    )
  25.     (XD::VEC:length v)
  26.   )
  27. )
  28. ;;;-----------------------------------------------------------;;
  29. ;;; 向量的模(长度)                                              ;;
  30. ;;; Vector Norm - Lee Mac                                             ;;
  31. ;;; Args: v - vector in R^n                                      ;;
  32. ;;;-----------------------------------------------------------;;
  33. (defun XD::Vec:length (v)
  34.   (sqrt (apply '+ (mapcar '* v v)))
  35. )
  36. ;;;-----------------------------------------------------------;;
  37. ;;; 向量乘标量(系数)                                              ;;
  38. ;;; Vector x Scalar - Lee Mac                                      ;;
  39. ;;; Args: v - vector in R^n, s - real scalar                      ;;
  40. ;;;-----------------------------------------------------------;;
  41. (defun XD::Vec:v*s (v s)
  42.   (mapcar (function (lambda (n) (* n s))) v)
  43. )




下面是测试命令,红色线画出弧线垂平面的Y轴,黄色线画出弧线垂平面的法线。

  1. (defun c:tt ()
  2.   (if (setq e (ssget ":E:N" '((0 . "arc"))))
  3.     (progn
  4.       (setq e    (ssname e 0)
  5.             ed   (entget e)
  6.             v210 (cdr (assoc 210 ed))
  7.             p1   (vlax-curve-getstartpoint e)
  8.             p2   (vlax-curve-getendpoint e)
  9.             v1   (mapcar '- p1 p2)
  10.             v1   (xd::vec:normalize v1)
  11.             v2   (xd::vec:vxv v210 v1)
  12.             p3 (mapcar '+ p2 (xd::vec:v*s v210 100.0))
  13.       )
  14.       (princ "\n弧线垂平面Y轴用红色线画出")
  15.       (command "line" p2 p3 "")
  16.       (vla-put-color (vlax-ename->vla-object (entlast)) 1)
  17.       (princ "\n弧线垂平面的法线向量是:")
  18.       (princ v2)
  19.       (command "line" p3 (mapcar '+ p3 (xd::vec:v*s v2 100)) "")
  20.       (vla-put-color (vlax-ename->vla-object (entlast)) 2)
  21.       (princ "\n用黄色线画出")
  22.     )
  23.   )
  24.   (princ)
  25. )



QQ截图20170424232449.png
XDRX API 写就是这样:

  1. (defun c:tt ()
  2.   (if (setq e (car (xdrx_entsel "\n拾取弧线<退出>:" '((0 . "arc")))))
  3.     (progn
  4.       (xdrx_getpropertyvalue e "normal" "startpoint" "endpoint")
  5.       (setq
  6.         v1 (mapcar '- #startpoint #endpoint)
  7.         v1 (xdrx_vector_normalize v1)
  8.         v2 (xdrx_vector_crossproduct #normal v1)
  9.         p3 (mapcar '+ p2 (xdrx_vector_product #normal 100.0))
  10.       )
  11.       (xdrx_line_make #endpoint p3)
  12.       (xdrx_setpropertyvalue (entlast) "color" 1)
  13.       (xdrx_prompt "\n弧线垂平面Y轴用红色线画出.\n弧线垂平面的法线向量是:" v2)
  14.       (xdrx_line_make
  15.         p3
  16.         (mapcar '+ p3 (xdrx_vector_product v2 100))
  17.       )
  18.       (xdrx_setpropertyvalue (entlast) "color" 2)
  19.       (xdrx_prompt "\n用黄色线画出")
  20.     )
  21.   )
  22.   (princ)
  23. )



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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2017-4-25 07:41:42 | 显示全部楼层
本帖最后由 csharp 于 2017-4-25 07:46 编辑

使用 align 和 c:cal 函数,先运行以下语句

  1. (mapcar        (function (lambda (x / fn)
  2.                     (if        (setq fn (findfile x))
  3.                       (arxload fn)
  4.                     )
  5.                   )
  6.         )
  7.         '("geom3d.crx" "geom3d.arx" "geomcal.crx" "geomcal.arx")
  8. )

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

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

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

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

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

下图示意了如何计算法向矢量:

normal.png

下例设置的视图方向垂直于选定对象。程序在平面视图中显示对象,而不会因平行投影而使对象扭曲。

命令: vpoint

当前视图方向: VIEWDIR=当前

指定视点或 [旋转(R)] <显示坐标球和三轴架>: 'cal

>> 表达式: nor

>> 给函数 NOR 选择圆、圆弧或多段线:

AutoLisp 中使用方法:

命令: (setq p1 (getpoint))
(1977.26 1043.75 0.0)

命令: (setq p2 (getpoint))
(2525.64 1043.75 0.0)

命令: (setq p3 (getpoint))
(1977.26 1496.45 410.61)

命令: (c:cal "nor(p1,p2,p3)")
(0.0 -0.671832 0.740704)

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

使用道具 举报

发表于 2019-10-19 13:36:05 | 显示全部楼层
请教一下楼主,要学习lisp语言要从何入手?买什么书或是有什么教学视频?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-23 10:16 , Processed in 0.198425 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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