找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2212|回复: 18

[讨论]:关于矩阵在ACAD二次开发中的应用的讨论...

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2002-11-7 19:09:40 | 显示全部楼层 |阅读模式

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

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

×
刚刚接触矩阵转换,希望各位赐教。一个UCS的创建过程。

  1. 命令:  UCS
  2. 当前 UCS 名称: *没有名称*
  3. 输入选项
  4. [新建(N)/移动(M)/正交(G)/上一个(P)/恢复(R)/保存(S)/删除(D)/应用(A)/?/世界(W)]
  5. <世界>: n
  6. 指定新 UCS 的原点或 [Z 轴(ZA)/三点(3)/对象(OB)/面(F)/视图(V)/X/Y/Z] <0,0,0>: 3
  7. 指定新原点 <0,0,0>:
  8. 在正 X 轴范围上指定点 <4950,-365,0>:  <正交 关>
  9. 在 UCS XY 平面的正 Y 轴范围上指定点 <4948,-365,0>:
  10. 命令:  UCS
  11. 当前 UCS 名称: *没有名称*
  12. 输入选项
  13. [新建(N)/移动(M)/正交(G)/上一个(P)/恢复(R)/保存(S)/删除(D)/应用(A)/?/世界(W)]
  14. <世界>: s
  15. 输入保存当前 UCS 的名称或 [?]: 1

  16. 命令: (entget (tblobjname "ucs" "1"))
  17. ((-1 . <图元名: 40190e48>)
  18. (0 . "UCS")
  19. (330 . <图元名: 40190c88>) (5 . "91")
  20. (100 . "AcDbSymbolTableRecord")
  21. (100 . "AcDbUCSTableRecord")
  22. (2 . "1")
  23. (70 . 0)
  24. [color=blue](10 26080.9 8121.94 0.0)
  25. (11 -0.408331 0.912834 0.0)
  26. (12 0.912834 0.408331 0.0) [/color]
  27. (79 . 0)
  28. (146 . 0.0)
  29. )
  30. 命令: setvar
  31. 输入变量名或 [?] <UCSORG>: ?

  32. 输入要列出的变量 <*>: ucs*

  33. UCSAXISANG        90
  34. UCSBASE           ""
  35. UCSFOLLOW         0
  36. UCSICON           1
  37. UCSNAME           "1"                                  (只读)
  38. [color=blue]UCSORG            26081,8122,0                         (只读)[/color]
  39. UCSORTHO          1
  40. UCSVIEW           1
  41. UCSVP             1
  42. UCSXDIR           0,1,0                                (只读)
  43. UCSYDIR           1,0,0                                (只读)
复制代码

用API 得到的转换矩阵

  1. 命令: (xdrx_matrix_ucs2wcs)
  2. (([color=red]-0.408331 0.912834 0.0[/color] [color=blue]26080.9[/color])
  3. [color=red](0.912834 0.408331 0.0[/color] [color=blue]8121.94[/color])
  4. [color=red](0.0 0.0 -1.0 0.0) [/color]
  5. (0.0 0.0 0.0 1.0)
  6. )

  7. _$ (xdrx_setenttodb (tblobjname "ucs" "1"))
  8. T
  9. _$ (xdrx_getentdxf 10)
  10. (26080.9 8121.94 0.0)
  11. _$ (xdrx_getentdxf 11)
  12. (-0.408331 0.912834 0.0)
  13. _$ (xdrx_getentdxf 12)
  14. (0.912834 0.408331 0.0)
  15. _$ ([color=red]xdrx_vector_CrossProduct [/color]
  16.          (xdrx_getentdxf 11)
  17.          (xdrx_getentdxf 12)
  18.    )
  19. [color=red](0.0 0.0 -1.0)[/color]

复制代码

用API写了个得到矩阵的函数,

  1. (defun $XDLSP_MATRIX_UCS2UCS (ucsname              /
  2.                               e                      ucs_org_pt
  3.                               ucs_x_vector    ucs_y_vector
  4.                               ucs_z_vector    cur_x_vector
  5.                               cur_y_vector    cur_z_vector
  6.                              )
  7.   (setq e (tblobjname "ucs" ucsname))
  8.   (xdrx_setenttodb e)
  9.   (setq        ucs_org_pt   (xdrx_getentdxf 10)
  10.         ucs_x_vector (xdrx_getentdxf 11)
  11.         ucs_y_vector (xdrx_getentdxf 12)
  12.         ucs_z_vector (xdrx_vector_CrossProduct ucs_x_vector ucs_y_vector)
  13.   )
  14.   (setq        cur_x_vector (getvar "ucsxdir")
  15.         cur_y_vector (getvar "ucsydir")
  16.         cur_z_vector (xdrx_vector_CrossProduct cur_x_vector cur_y_vector)
  17.   )
  18.   (xdrx_matrix_AlignCoordSystem
  19.     (getvar "ucsorg") cur_x_vector cur_y_vector cur_z_vector
  20.     ucs_org_pt        ucs_x_vector ucs_y_vector ucs_z_vector
  21.   )
  22. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-10 00:59:55 | 显示全部楼层
矩阵转换掌握的好了,很多问题都迎刃而解,ACAD的基础图形几何学基石就是矩阵的应用,点变换、实体变换、坐标系变换、投影变换等等都是通过矩阵变换完成的。通过矩阵运算可以略去很多中间生成图形的步骤,直接得到最终的变换矩阵,把变换矩阵作用到处理的对象上,对象就会变换到最终结果。

这个应用还可以用到拖动上,XDRX_API的动态拖动,中间可以任意变换拖动实体位置、景象、对齐、翻转等等都是用了矩阵变换。

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2002-11-10 19:35:44 | 显示全部楼层
最初由 XDSoft 发布
[B]矩阵转换掌握的好了,很多问题都迎刃而解,ACAD的基础图形几何学基石就是矩阵的应用,点变换、实体变换、坐标系变换、投影变换等等都是通过矩阵变换完成的。通过矩阵运算可以略去很多中间生成图形的步骤,直接得到最... [/B]

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-10 19:40:04 | 显示全部楼层
下面我给大家写两个测试程序,TEST1,TEST2,分别演示了分步骤利用矩阵转换和一次用最终的转换矩阵来变换实体的方法。


  1. [FONT=courier new]
  2. ;|
  3.   这个函数是选择集的移动变换
  4. |;
  5. (defun $xdlsp_pickset_transform (ss mRMatrix / e)
  6.   (xdrx_setsstodb ss 0)
  7.   (while (setq e (xdrx_getentdata 0))
  8.     (xdrx_entity_transForm e mRMatrix)
  9.   )
  10.   (princ)
  11. )
  12. ;|
  13.   这个函数是选择集的拷贝变换
  14. |;
  15. (defun $xdlsp_pickset_transformedCopy (ss mRMatrix / e)
  16.   (xdrx_setsstodb ss 0)
  17.   (while (setq e (xdrx_getentdata 0))
  18.     (xdrx_entity_transFormedCopy e mRMatrix)
  19.   )
  20.   (princ)
  21. )
  22. ;|
  23.   测试一,测试分开的操作,使用了两次变换的结果
  24. |;
  25. (defun c:test1 ()
  26.   (if (and
  27.         (setq ss (ssget))
  28.         (setq pj (getpoint "\nPick Base Point<Quit>:"))
  29.         (progn
  30.           (setvar "pdmode" 3)
  31.           (command ".point" pj)
  32.           t
  33.         )
  34.         (setq ang (getangle "\nRotated Angle<Quit>:"))
  35.       )
  36.     (progn
  37.       (setq mt0 (xdrx_matrix_identity 3)
  38.             mt (xdrx_matrix_setRotation mt0 ang '(0 0 1) pj);构造旋转变换矩阵
  39.       )
  40.       (xdrx_setmark)
  41.       ($xdlsp_pickset_transformedCopy ss mt);拷贝变换,保留原来选择集
  42.       (setq ss (xdrx_getss))
  43.       (xdrx_PickSet_redraw ss);;亮显结果选择集,该函数非常快。
  44.       (if (setq pj2 (getpoint pj "\nMirror Axis<Quit>:"))
  45.         (progn
  46.           (xdrx_PickSet_redraw ss t);;取消亮显
  47.           (setq mr (xdrx_matrix_setMirror mt0 (list pj pj2)));构造镜像变换矩阵
  48.           (xdrx_setmark)
  49.           ($xdlsp_pickset_transformedCopy ss mr);拷贝变换,保留原来选择集
  50.           (setq ss (xdrx_getss))
  51.           (xdrx_PickSet_redraw ss);;亮显结果选择集,该函数非常快。
  52.         )
  53.       )
  54.     )
  55.   )
  56.   (princ)
  57. )
  58. ;|
  59.   测试二,一次性构造好最终的变换矩阵,一次就变换选择集到最终结果
  60. |;
  61. (defun c:test2 ()
  62.   (if (and
  63.         (setq ss (ssget))
  64.         (setq pj (getpoint "\nPick Base Point<Quit>:"))
  65.         (progn
  66.           (setvar "pdmode" 3)
  67.           (command ".point" pj)
  68.           t
  69.         )
  70.         (setq ang (getangle "\nRotated Angle<Quit>:"))
  71.         (setq pj2 (getpoint pj "\nMirror Axis<Quit>:"))
  72.       )
  73.     (progn
  74.       (setq mt0 (xdrx_matrix_identity 3) ;单位矩阵
  75.             Mat1 (xdrx_matrix_setRotation mt0 ang '(0 0 1) pj);构造旋转变换矩阵
  76.             Mat2 (xdrx_matrix_setMirror mt0 (list pj pj2));构造镜像变换矩阵
  77.             Mat (xdrx_matrix_product Mat2 Mat1);; 矩阵相乘,得到最终变换矩阵,记住有顺序,后变换的矩阵在前面
  78.       )
  79.       (xdrx_line1 pj pj2)
  80.       (xdrx_setmark)
  81.       ($xdlsp_pickset_transformedCopy ss Mat);拷贝变换,保留原来选择集
  82.       (setq ss (xdrx_getss))
  83.       (xdrx_PickSet_redraw ss);;亮显结果选择集,该函数非常快。
  84.     )
  85.   )
  86.   (princ)
  87. )
  88. [/FONT]


下面是演示,希望能加深大家对矩阵的理解。


下载地址:http://www.xdcad.net/tech/dev/matrix-1.swf

<embed src=http://www.xdcad.net/tech/dev/matrix-1.swf quality=high width=512 height=482 loop=true type="application/x-shockwave-flash">
</embed>
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2002-11-10 19:56:00 | 显示全部楼层
测试中选择物体后

  1. 命令: test1

  2. 选择对象: 指定对角点: 找到 4 个

  3. 选择对象:
  4. [color=blue]int:正在重生成模型。[/color]

  5. Rotated Angle:指定第二点:  <正交 关>
  6. Mirror Axis:
复制代码

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-11-10 20:00:03 | 显示全部楼层
最初由 eachy 发布
[B]测试中选择物体后

  1. 命令: test1

  2. 选择对象: 指定对角点: 找到 4 个

  3. 选择对象:
  4. [color=blue]int:正在重生成模型。[/color]

  5. Rotated Angle:指定第二点:  <正交 关>
  6. Mirror Axis:
复制代码

重生成模型... [/B]


矩阵本身不重新生成的,是上面的LISP,为了醒目,把基点给POINT出来了,设置了系统变量pdmode变成了十字,才引起的重新生成。

上面程序仅仅是用到选择几个图形做演示用,你不要在打开一个大图时候做。

刚才,又给大家写了一个工具,解决探索者结构软件点钢筋的缩放问题的,也用到了矩阵转换,缩放是向着角点缩放,而不是仅仅自身缩放,这样才满足要求。

使用XDRX_API写的程序都非常的短,下面程序还演示了嵌套选择集处理的用法。


  1. [FONT=courier new]
  2. ;|
  3.    命令:XDTB_REIN_SCL
  4.    功能:对TSSD结构软件的钢筋大样图的点钢筋根据比例缩放
  5.    说明:1、请在世界坐标系下使用。
  6.         2、回车处理图中所有箍筋,否则,用户要选箍筋进行处理
  7.       
  8. |;
  9. (defun c:XDTB_REIN_SCL (/ ss scl e e1 box p1 ss1)
  10.   (prompt "\n请选取要缩放点钢筋的外箍筋<全选>:")
  11.   (if (not (setq ss (ssget '((0 . "lwpolyline") (8 . "rein")))))
  12.     (setq ss (ssget "x" '((0 . "lwpolyline") (42 . 0.0)
  13.                      (70 . 0)
  14.                      (8 . "rein")
  15.                     )
  16.              )
  17.     )
  18.   )
  19.   (if (not $tssd_rein_scl)
  20.     (setq $tssd_rein_scl 1.0)
  21.   )
  22.   (initget 6)
  23.   (if (setq scl (getreal (strcat "\n请输入点钢筋缩放比例<" (rtos $tssd_rein_scl
  24.                                                                  2 2
  25.                                                            ) ">:"
  26.                          )
  27.                 )
  28.       )
  29.     (setq $tssd_rein_scl scl)
  30.   )
  31.   (xdrx_begin)
  32.   (setq $dist 100)                       ; 搜索顶点范围,找点钢筋
  33.   (xdrx_setsstodb ss 0)
  34.   (while (setq e (xdrx_getentdata 0))
  35.     (setq box (xdrx_entity_box e))
  36.     (while (car box)
  37.       (setq p1 (car box)
  38.             box (cdr box)
  39.             ss1 (xdrx_getptss p1 $dist '((8 . "rein") (0 . "LWPOLYLINE")))
  40.       )
  41.       (xdrx_setsstodb ss1 1)
  42.       (while (setq e1 (xdrx_getentdata 1))
  43.         (if (xdrx_polyline_hasbulges e1)
  44.           (progn
  45.             (setq mt (xdrx_matrix_setScale (xdrx_matrix_identity) $tssd_rein_scl p1));构造缩放矩阵
  46.             (xdrx_entity_transform e1 mt);;实体缩放
  47.           )
  48.         )
  49.       )
  50.     )
  51.   )
  52.   (xdrx_end)
  53. )
  54. [/FONT]


下面是演示,程序能保证点钢筋正确位置,不仅仅是缩放。


下载地址:http://www.xdcad.net/tech/tssd-rein1.swf

<embed src=http://www.xdcad.net/tech/tssd-rein1.swf quality=high width=512 height=482 loop=true type="application/x-shockwave-flash">
</embed>

点下面附件下载,拷贝到“晓东工具箱”LISP目录下,加载后,用命令:XDTB_Rein_Scl 执行
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2002-12-16 00:37:39 | 显示全部楼层
xdrx_matrix_setTransLation 到底怎么用
(xdrx_matrix_setTransLation '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0)) '(1 2 3)  ) 返回的怎么是nil
(xdrx_matrix_setTransLation '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))  123  )  也是nil
"平移向量"到底什么意思?
是不是坐标差,但怎么会是nil了呢?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-12-16 01:01:04 | 显示全部楼层
最初由 aeo 发布
[B]xdrx_matrix_setTransLation 到底怎么用
(xdrx_matrix_setTransLation '((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0)) '(1 2 3)  ) 返回的怎么是nil
(xdrx_matrix_setTransLation '((1.0 0.0 0.0) (0.0 1.0 0.0) (... [/B]


第一个参数是3D矩阵,可以是单位矩阵,也可以是任意矩阵,该函数作用就是设置给定矩阵的平移部分。

因此,你给的第一个参数不对,3D矩阵是四行四列。你可以先用 (setq mat (xdrx_matrix_identity 3)) 得到一个3D单位矩阵。

第二个参数是平移向量(向量以前讨论过,可以理解为相对坐标X Y Z 差)

所以,你应该:

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2002-12-16 21:43:56 | 显示全部楼层
我自己搞错了括号,本来就是按你的方法写的,求不出来,上面随便打个比方,结果打错了.
另外的问题:
我用(setq dis(cadr(xdrx_getarea curve)))求出长度(带弧的),比如分成5份(setq dis1(/ dis 5))
(xdrx_curve_getpointatdist curve (* dis1 5))竟然不在curve上.
我想是精确程度不够,怎么消除这误差?dis1减掉一点?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 181个

财富等级: 日进斗金

发表于 2002-12-16 21:59:06 | 显示全部楼层
如何构造投影的矩阵,比如求点投影在一条直线上的点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-12-16 22:20:02 | 显示全部楼层
最初由 efan2000 发布
[B]如何构造投影的矩阵,比如求点投影在一条直线上的点。 [/B]


构筑投影变换矩阵:

  1. [font=courier new]
  2. 309. xdrx_matrix_Projection

  3. 功能:构造投影变换矩阵

  4. 调用格式:(xdrx_matrix_Projection <矩阵> <投影平面> <投影方向>)

  5. 返回值:3D投影转换矩阵

  6. 说明:<投影平面>--3点定的一个平面,遵循右手法则,时针方向不在一条直线上的三点(点 点 点)
  7.       <投影方向>--向量(点表示)

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-12-16 22:24:04 | 显示全部楼层
最初由 aeo 发布
[B]我自己搞错了括号,本来就是按你的方法写的,求不出来,上面随便打个比方,结果打错了.
另外的问题:
我用(setq dis(cadr(xdrx_getarea curve)))求出长度(带弧的),比如分成5份(setq dis1(/ dis 5))
(xdrx_curve_getp... [/B]


你求曲线样本点(等分点或者满足弦高差误差)你可以用

  1. [font=courier new]
  2. 89. xdrx_getsamplept

  3. 功能:按给定精度,返回AcDbCurve类曲线和AcDb2dPolyline(旧的POLYLINE)的样本点。将复杂的曲线用点组成的线段模拟。

  4. 调用格式:(xdrx_getsamplept <AcDbCurve 或 AcDb2dPolyline实体图元名> [精度控制])

  5. 说明:给定的[精度控制]值玄高差越小,精度越高,分段数越大,精度越高。
  6.       
  7.      精度控制只对曲线段有效,对于POLYLINE,对直线段无效,对其中的ARC段数据起做用。
  8.   
  9.      若不给[精度控制]参数,那么程序自己计算出相对满足视觉误差的值做为玄高差进行分段。

  10.      [精度控制]:分两种方法
  11.       1:给整数,按给定的整数分曲线段
  12.       2:给实数,做为玄高差
  13.      
  14.      注意:对于AcDbSpline,只能给定"玄高差",若给整数值,那么程序按照计算的相对最优值做为玄高差。

  15. 返回值:若成功,返回点表,点表肯定包括曲线的开始点和终止点。(p1 p2......),失败返回NIL.

  16. 示例:用LINE模拟SPLINE
  17.      (if (setq en (xdrx_entsel "\n请点取一个Spline<退出>:") '((0 . "spline"))))
  18.         (progn
  19.         (setq ed (xdrx_getsamplept (car en)))
  20.         (apply 'command (cons "line" ed))
  21.         (command "")
  22.      )   

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2002-12-16 23:32:56 | 显示全部楼层
你理解错了
我想把一条曲线等分后,在等分点上转化矩阵,当然我也想把顶点也加在里面.
但用上面方法对曲度大的,最后点(距离为no*dis)时,这点就不在曲线上了,
(用你xarray里的$get_point方法,端点不在表里,照理最后的端点应该在的,说明no*dis距离的点不在这曲线上)
而我想要这一点,而且要保证在曲线上才行.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-12-16 23:44:11 | 显示全部楼层
最初由 aeo 发布
[B]你理解错了
我想把一条曲线等分后,在等分点上转化矩阵,当然我也想把顶点也加在里面.
但用上面方法对曲度大的,最后点(距离为no*dis)时,这点就不在曲线上了,
(用你xarray里的$get_point方法,端点不在表里,照理最后?.. [/B]


xdrx_getsamplept 就能获得等分的点,并且保证在曲线上,然后你在用转换矩阵等。

xdrx_GetPointAtDist 参数是距离起点的距离,然后求这个距离的点,所以只要有返回值,肯定是保证在曲线上的。

如果放心,可以用:

  1. [font=courier new]
  2. 250. xdrx_curve_ClosestPoint

  3. 功能:获得曲线外点到曲线最近距离曲线上的点,或者两条曲线间最近距离的点。

  4. 调用格式:(xdrx_curve_ClosestPoint <曲线实体名> <曲线外点>)
  5.          (xdrx_curve_ClosestPoint <曲线实体名> <曲线实体名>)
  6.          
  7. 返回值:表(距离 曲线1点 曲线2点)   
  8. [/font]
复制代码


另外还有:

  1. [font=courier new]
  2. (xdrx_curve_getClosestPoint < 曲线实体名 > <曲线外点> )
  3. [/font]
复制代码
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2002-12-17 01:03:18 | 显示全部楼层
;你试一下:都用你的api
;先画一个曲度很大的弧curve
(setq curve (car (entsel)))
(setq len(cadr (xdrx_getarea curve)) ) ;长度
(setq p1(car(xdrx_curve_GetPoint curve))) ;弧起点
(setq p2(xdrx_curve_getpointatdist curve p1 len))
;p2应该是弧终点,凸度大的就返回nil,凸度小或直线就可以.
;看来只能用xdrx_getsamplept 了
;但是xdrx_getsamplept 一既有直线又有弧的pl线,对弧才有效.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-9 13:21 , Processed in 0.205107 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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