找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4448|回复: 25

[编程申请]:怎么画这个圆柱

[复制链接]
发表于 2002-8-6 11:05:37 | 显示全部楼层 |阅读模式

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

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

×
想利用已有一根空间LINE为中心线,绘制一个圆柱,圆柱的底面在LINE的起点上,厚度为线长。绘制时总得调整UCS,有没有直接计算的方法?
((-1 . <图元名: 5ea0550>) (0 . "LINE") (5 . "9A") (100 . "AcDbEntity") (67 . 0)
(8 . "0") (100 . "AcDbLine") (10 1.0 2.0 3.0) (11 6.0 5.0 4.0) (210 0.0 0.0 1.0))
((-1 . <图元名: 5ea0558>) (0 . "CIRCLE") (5 . "9B") (100 . "AcDbEntity") (67 . 0) (8 . "0") (100 . "AcDbCircle") (39 . 5.91608) (10 1.20049 2.63796 2.36643)
(40 . 1.0) (210 0.845154 0.507093 0.169031))
关键是圆的10项和210项怎么计算?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-8-6 11:13:46 | 显示全部楼层

Re: [编程申请]:怎么画这个圆柱

最初由 漏网之鱼 发布
[B]想利用已有一根空间LINE为中心线,绘制一个圆柱,圆柱的底面在LINE的起点上,厚度为线长。绘制时总得调整UCS,有没有直接计算的方法?
((-1 . <图元名: 5ea0550>) (0 . "LINE") (5 . "9A") (100 . "AcDbEntity") (6... [/B]


210是圆柱底平面的Z轴矢量,

关键是要得到圆的平面,通过已知的LINE的两端点,用(终点-起点)得到向量,然后把这个矢量normlize(单位化)就是210了。

XDRX_API对矢量提供了所有的ObjectArx几何类库的AcGeVector类方法:

单位化矢量的函数是:

329. xdrx_vector_Normalize

功能:求向量的单位向量

调用格式:(xdrx_vector_Normalize <向量>)

返回值:向量

其他关于矢量处理的:

  1. [FONT=courier new]
  2. 322. xdrx_vector_CrossProduct

  3. 功能:求两向量的差积

  4. 调用格式:(xdrx_vector_CrossProduct <三维向量1> <三维向量2>)

  5. 返回值:三维向量

  6. 说明:两向量差积结果得到的第三个向量和前两个向量互相正交,即垂直于
  7.      前两个向量决定的平面。
  8.      
  9. 323. xdrx_vector_DotProduct   

  10. 功能:求两个向量的点积

  11. 调用格式:(xdrx_vector_DotProduct <向量1> <向量2>)

  12. 返回值:两向量夹角的余玄

  13. 324. xdrx_vector_IsParallel

  14. 功能:判断两向量是否平行

  15. 调用格式:(xdrx_vector_IsParallel <向量1> <向量2>)

  16. 返回值:平行 T 否 NIL

  17. 325. xdrx_vector_IsPerpendicular

  18. 功能:判断两向量是垂直

  19. 调用格式:(xdrx_vector_IsPerpendicular <向量1> <向量2>)

  20. 326. xdrx_vector_IsCodirectional

  21. 功能:判断两向量是否同向

  22. 调用格式:(xdrx_vector_IsCodirectional <向量1> <向量2>)

  23. 返回值:同向T 否NIL

  24. 327. xdrx_vector_Negate

  25. 功能:求负向量

  26. 调用格式:(xdrx_vector_Negate <向量>)

  27. 返回值:向量

  28. 328. xdrx_vector_PerpVector

  29. 功能:求切向量

  30. 调用格式:(xdrx_vector_PerpVector <向量>)

  31. 返回值:向量

  32. 329. xdrx_vector_Normalize

  33. 功能:求向量的单位向量

  34. 调用格式:(xdrx_vector_Normalize <向量>)

  35. 返回值:向量

  36. 330. xdrx_vector_Length

  37. 功能:求向量的长度

  38. 调用格式:(xdrx_vector_Length <向量>)

  39. 返回值:实数

  40. 331. xdrx_vector_IsEqual

  41. 功能:判断两向量是否相等

  42. 调用格式:(xdrx_vector_IsEqual <向量1> <向量2>)

  43. 332. xdrx_vector_OrthoProject

  44. 功能:向量向一个平面正投影,得到投影后的向量

  45. 调用格式:(xdrx_vector_OrthoProject <3维向量> <指定平面的normal向量>)

  46. 返回值:向量

  47. 说明:仅对三维向量操作
  48.      有NORMAL代表投影到的平面
  49.      
  50. 333. xdrx_vector_Project

  51. 功能:向量向一个平面沿着指定的方向投影

  52. 调用格式:(xdrx_vector_Project <三维向量> <代表平面的normal向量> <投影方向向量>)

  53. 返回值:向量

  54. 说明:向量投影操作,事先应该用(xdrx_vector_IsParallel <向量> <平面NORMAL向量>)
  55.      判断向量是否平行,若平行,将不能投影

  56. 334. xdrx_vector_product

  57. 功能:向量和一个矩阵左相乘

  58. 调用格式:(xdrx_vector_product <向量1> <矩阵>)

  59. 返回值:向量


  60. 335. xdrx_vector_Angle

  61. 功能:求两向量的夹角

  62. 调用格式:(xdrx_vector_Angle <向量1> <向量2>)

  63. 返回值:实数

  64. 336. xdrx_vector_Transform

  65. 功能:用一个前置矩阵转换该向量

  66. 调用格式:(xdrx_vector_Transform <向量> <转换矩阵>)

  67. 返回值:向量

  68. 说明:矩阵的维数必须和向量的维数相同。二维或者三维

  69. 338. xdrx_vector_Rotate

  70. 功能:向量旋转

  71. 调用格式:(xdrx_vector_Rotate <向量> <角度>)

  72. 返回值:向量

  73. 339. xdrx_vector_Mirror

  74. 功能:镜像向量

  75. 调用格式:
  76.         1、(xdrx_vector_Mirror <二维向量> <镜像基二维向量>)
  77.         2、(xdrx_vector_Mirror <三维向量> <镜像平面>)
  78.         
  79. 返回值:向量

  80. 说明:<镜像平面>:  向量代表的平面,normal向量

  81. 340. xdrx_vector_Divide

  82. 功能:向量除以一个比例系数

  83. 调用格式:(xdrx_vector_Divide <向量> <比例>)

  84. 返回值:向量

  85. 341. xdrx_vector_LargestElement

  86. 功能:返回一个三维向量中的绝对值最大的元素

  87. 调用格式:(xdrx_vector_LargestElement <三维向量>)

  88. 返回值:实数

  89. 342. xdrx_vector_LengthSqrd
  90. ******************

  91. 343. xdrx_vector_IsZeroLength

  92. 功能:判断向量是否是0长度

  93. 调用格式:(xdrx_vector_IsZeroLength <向量>)

  94. 返回值:是T 否NIL

  95. 344. xdrx_vector_IsUnitLength

  96. 功能:判断一个向量是否是单位向量

  97. 调用格式:(xdrx_vector_IsUnitLength <向量>)

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-8-6 11:58:58 | 显示全部楼层
如果实体很多,不想在座标系间来回用UCS命令转变,那么就需要自己建立UCS到WCS的转换矩阵,然后把矩阵作用到点上就可以变换点了。

首先要构筑转换矩阵(例如简单的平移)

315. xdrx_matrix_SetTranslation

功能:设置一个矩阵的平移向量

调用格式:(xdrx_matrix_SetTranslation <2d or 3d矩阵> <平移向量>)

返回值:矩阵

说明: <平移向量>--对2D矩阵,是2D 向量
                   对3D矩阵  是3D 向量

构筑一个转换矩阵后,可以用下面的函数作用到点上,完成点在座标系间的转换

357. xdrx_point_transform

功能:将一个转换矩阵作用于点上。

调用格式:(xdrx_point_transform <点> <转换矩阵>)

返回值:变换后的点

说明:转换矩阵维数要和点的维数相同。

XDRX_API对ObjectARX的几何库中的所有矩阵AcGeMatrix3d,2d类的方法都提供了LISP下使用的函数

图形学变换关键的就是构筑转换矩阵,矩阵构造好了,作用到点上,就是变换点,作用的实体上,就是对实体移动、变比例、旋转、平移、镜像等等。

使用XDRX_API几个transFrom函数,可以实现所有ACAD关于实体的编辑操作。如:xdrx_entity_transFrom,xdrx_entity_transFromedCopy都是把转换矩阵作用到实体上进行实体的变换。


关于座标系间矩阵变换的函数:



  1. [FONT=courier new]
  2. 295. xdrx_matrix_wcs2ucs

  3. 功能:获得WCS->当前UCS的转换矩阵                           

  4. 调用格式:(xdrx_matrix_wcs2ucs)

  5. 返回值:矩阵表

  6. 例子:Command: (xdrx_matrix_wcs2ucs)
  7.                ((1.0 0.0 0.0 -23768.7) (0.0 1.0 0.0 -10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
  8.       当前UCS原点的WCS值:
  9.       Command: ucsorg
  10.       UCSORG = 23769,10864,0 (read only)   
  11.       
  12. 296. xdrx_matrix_ucs2wcs

  13. 功能:获得当前UCS->WCS的转换矩阵

  14. 调用格式:(xdrx_matrix_ucs2wcs)

  15. 返回值:矩阵表

  16. 例子:当前UCS原点的WCS值:
  17.       Command: ucsorg
  18.       UCSORG = 23769,10864,0 (read only)  
  19.       
  20.       Command: (xdrx_matrix_ucs2wcs)
  21.       ((1.0 0.0 0.0 23768.7) (0.0 1.0 0.0 10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
  22.       
  23. 程序举例:求当前UCS下一点的WCS值,要用UCS->WCS的转换矩阵乘以该点。
  24.       Command: (setq p(getpoint))
  25.                (-6727.99 -716.155 0.0)      ;ucs下点

  26.       Command: (setq pp (xdrx_matrix_ucs2wcs))  ;;得到UCS->WCS转换矩阵                              
  27.       ((1.0 0.0 0.0 23768.7) (0.0 1.0 0.0 10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))                                                                     
  28.                                                                                  
  29.       Command: (setq pwcs (xdrx_point_transform p pp)) ;;转换矩阵作用到点P                          
  30.       (17040.7 10148.0 0.0)   ;;变成WCS下的点                                                   
  31.                                                                                  
  32.       Command: (trans p 1 0)   ;;使用trans函数验证结果                                                
  33.       (17040.7 10148.0 0.0)   
  34.       
  35. 297.  xdrx_matrix_ecs2wcs

  36. 功能:获得对象的ECS(OCS)到WCS下的转换矩阵

  37. 调用格式:(xdrx_matrix_ecs2wcs <实体名>)

  38. 返回值:矩阵表

  39. 298. xdrx_matrix_block2wcs

  40. 功能:获得块BLOCK到WCS下的转换矩阵

  41. 调用格式:(xdrx_matrix_block2wcs <insert实体名>)

  42. 返回值:矩阵

  43. 299. xdrx_matrix_image2Wcs

  44. 功能:获得IMAGE图像实体象素到WCS下的转换矩阵

  45. 调用格式:(xdrx_matrix_image2Wcs <image实体名>)

  46. 返回值:矩阵

  47. 302. xdrx_matrix_setCoordsystem

  48. 功能:设置转换矩阵的坐标系

  49. 调用格式:1. 2d
  50.              (xdrx_matrix_setCoordsystem <矩阵AcGeMatrix2d> <2d原点> <X轴> <Y轴>)
  51.           2. 3D
  52.              (xdrx_matrix_setCoordsystem <矩阵AcGeMatrix3d> <3d原点> <X轴> <Y轴> <Z轴>)
  53.             
  54. 返回值:矩阵表

  55. 303. xdrx_matrix_getCoordsystem

  56. 功能:获得一个转换矩阵的坐标系

  57. 调用格式:(xdrx_matrix_getcoordsystem <2d or 3d矩阵>)

  58. 返回值:表(原点 X轴向量 Y轴向量 Z轴向量)

  59. 例子:
  60. Command: !pp  ;;ucs->wcs的转换矩阵
  61. ((1.0 0.0 0.0 23768.7) (0.0 1.0 0.0 10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
  62. Command: (xdrx_matrix_getcoordsystem pp) ;;获得UCS的坐标系
  63. ((23768.7 10864.1 0.0) (1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))

  64. 304. xdrx_matrix_AlignCoordSystem

  65. 功能:构造从一个坐标系到另一个坐标系的转换矩阵

  66. 调用格式:
  67.          1:2D矩阵转换
  68.          (xdrx_matrix_AlignCoordSystem <from 原点> <from X轴向量> <from Y轴向量>
  69.                                        <To 原点>  <To X轴向量>  <To Y轴向量> )
  70.                                        
  71.          2: 3D矩阵转换                              

  72.          (xdrx_matrix_AlignCoordSystem <From 原点> <FromX轴向量> <From Y轴向量> <From Z轴向量>
  73.                                        <To 原点>  <To X轴向量>  <To Y轴向量> <To Z轴向量>)

  74. 返回值:矩阵[/FONT]


关于所有的矩阵方面的函数


  1. [FONT=courier new]
  2. 294. xdrx_matrix_identity

  3. 功能:获得一个2d or 3d的单位矩阵

  4. 调用格式:(xdrx_matrix_identity [维数])

  5. 返回值:三个或者四个元素的表,单位矩阵

  6. 说明:[维数]- 2:构造一个2D 单位矩阵
  7.               3:构造一个3D 单位矩阵
  8.               
  9. 例子:Command: (xdrx_matrix_identity 2)
  10.                ((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))
  11.       Command: (xdrx_matrix_identity 3)
  12.                ((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))     
  13.                
  14. 295. xdrx_matrix_wcs2ucs

  15. 功能:获得WCS->当前UCS的转换矩阵                           

  16. 调用格式:(xdrx_matrix_wcs2ucs)

  17. 返回值:矩阵表

  18. 例子:Command: (xdrx_matrix_wcs2ucs)
  19.                ((1.0 0.0 0.0 -23768.7) (0.0 1.0 0.0 -10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
  20.       当前UCS原点的WCS值:
  21.       Command: ucsorg
  22.       UCSORG = 23769,10864,0 (read only)   
  23.       
  24. 296. xdrx_matrix_ucs2wcs

  25. 功能:获得当前UCS->WCS的转换矩阵

  26. 调用格式:(xdrx_matrix_ucs2wcs)

  27. 返回值:矩阵表

  28. 例子:当前UCS原点的WCS值:
  29.       Command: ucsorg
  30.       UCSORG = 23769,10864,0 (read only)  
  31.       
  32.       Command: (xdrx_matrix_ucs2wcs)
  33.       ((1.0 0.0 0.0 23768.7) (0.0 1.0 0.0 10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
  34.       
  35. 程序举例:求当前UCS下一点的WCS值,要用UCS->WCS的转换矩阵乘以该点。
  36.       Command: (setq p(getpoint))
  37.                (-6727.99 -716.155 0.0)      ;ucs下点

  38.       Command: (setq pp (xdrx_matrix_ucs2wcs))  ;;得到UCS->WCS转换矩阵                              
  39.       ((1.0 0.0 0.0 23768.7) (0.0 1.0 0.0 10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))                                                                     
  40.                                                                                  
  41.       Command: (setq pwcs (xdrx_point_transform p pp)) ;;转换矩阵作用到点P                          
  42.       (17040.7 10148.0 0.0)   ;;变成WCS下的点                                                   
  43.                                                                                  
  44.       Command: (trans p 1 0)   ;;使用trans函数验证结果                                                
  45.       (17040.7 10148.0 0.0)   
  46.       
  47. 297.  xdrx_matrix_ecs2wcs

  48. 功能:获得对象的ECS(OCS)到WCS下的转换矩阵

  49. 调用格式:(xdrx_matrix_ecs2wcs <实体名>)

  50. 返回值:矩阵表

  51. 298. xdrx_matrix_block2wcs

  52. 功能:获得块BLOCK到WCS下的转换矩阵

  53. 调用格式:(xdrx_matrix_block2wcs <insert实体名>)

  54. 返回值:矩阵

  55. 299. xdrx_matrix_image2Wcs

  56. 功能:获得IMAGE图像实体象素到WCS下的转换矩阵

  57. 调用格式:(xdrx_matrix_image2Wcs <image实体名>)

  58. 返回值:矩阵

  59. 300. xdrx_matrix_inverse

  60. 功能:获得一个矩阵的逆矩阵

  61. 调用格式:(xdrx_matrix_inverse <2d or 3d矩阵>)

  62. 返回值:矩阵表

  63. 说明:矩阵的格式见函数xdrx_matrix_identity获得的结果。

  64. 例子:

  65. Command: !pp
  66. ((1.0 0.0 0.0 23768.7) (0.0 1.0 0.0 10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0
  67. 1.0))

  68. Command: (setq p1 (xdrx_matrix_inverse pp)) ;;求逆矩阵
  69. ((1.0 0.0 0.0 -23768.7) (0.0 1.0 0.0 -10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0
  70. 1.0))

  71. Command: (setq product (xdrx_matrix_product pp p1)) ;;原来矩阵×逆矩阵=单位矩阵
  72. ((1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))

  73. 301. xdrx_matrix_Determinant

  74. 功能:求矩阵行列式的值

  75. 调用格式:(xdrx_matrix_Determinant <2d or 3d矩阵>)

  76. 返回值:实数

  77. 302. xdrx_matrix_setCoordsystem

  78. 功能:设置转换矩阵的坐标系

  79. 调用格式:1. 2d
  80.              (xdrx_matrix_setCoordsystem <矩阵AcGeMatrix2d> <2d原点> <X轴> <Y轴>)
  81.           2. 3D
  82.              (xdrx_matrix_setCoordsystem <矩阵AcGeMatrix3d> <3d原点> <X轴> <Y轴> <Z轴>)
  83.             
  84. 返回值:矩阵表

  85. 303. xdrx_matrix_getCoordsystem

  86. 功能:获得一个转换矩阵的坐标系

  87. 调用格式:(xdrx_matrix_getcoordsystem <2d or 3d矩阵>)

  88. 返回值:表(原点 X轴向量 Y轴向量 Z轴向量)

  89. 例子:
  90. Command: !pp  ;;ucs->wcs的转换矩阵
  91. ((1.0 0.0 0.0 23768.7) (0.0 1.0 0.0 10864.1) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0))
  92. Command: (xdrx_matrix_getcoordsystem pp) ;;获得UCS的坐标系
  93. ((23768.7 10864.1 0.0) (1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0))

  94. 304. xdrx_matrix_AlignCoordSystem

  95. 功能:构造从一个坐标系到另一个坐标系的转换矩阵

  96. 调用格式:
  97.          1:2D矩阵转换
  98.          (xdrx_matrix_AlignCoordSystem <from 原点> <from X轴向量> <from Y轴向量>
  99.                                        <To 原点>  <To X轴向量>  <To Y轴向量> )
  100.                                        
  101.          2: 3D矩阵转换                              

  102.          (xdrx_matrix_AlignCoordSystem <From 原点> <FromX轴向量> <From Y轴向量> <From Z轴向量>
  103.                                        <To 原点>  <To X轴向量>  <To Y轴向量> <To Z轴向量>)

  104. 返回值:矩阵

  105. 305. xdrx_matrix_setScale

  106. 功能:设置转换矩阵的全局比例系数                                       

  107. 调用格式:
  108.          1:2D矩阵
  109.             (xdrx_matrix_setScale <矩阵> <比例> <2d 基点>)
  110.          2: 3D矩阵
  111.             (xdrx_matrix_setScale <矩阵> <比例> <3d 基点>)
  112.             
  113. 返回值:矩阵   

  114. 306. xdrx_matrix_Scalefactor

  115. 功能:获得矩阵的全局比例系数

  116. 调用格式:(xdrx_matrix_Scalefactor <2d or 3d矩阵>)

  117. 返回值:实数

  118. 307. xdrx_matrix_setRotation

  119. 功能:设置转换矩阵的旋转角

  120. 调用格式:
  121.           1、2D转换矩阵
  122.              (xdrx_matrix_setRotation <2d矩阵> <角度弧度值> <2D基点>)
  123.             
  124.           2、3D转换矩阵
  125.              (xdrx_matrix_setRotation <3d矩阵> <角度弧度值> <转轴向量> <基点>)

  126. 返回值:旋转矩阵               

  127. 308. xdrx_matrix_setMirror

  128. 功能:构造镜像矩阵

  129. 调用格式:1、2D转换矩阵
  130.           (xdrx_matrix_setMirror <2d矩阵> <镜像点>)
  131.           (xdrx_matrix_setMirror <2d矩阵> <镜像线>)
  132.          
  133.           2、3D转换矩阵
  134.          
  135.           (xdrx_matrix_setMirror <3d矩阵> <镜像点>)
  136.           (xdrx_matrix_setMirror <2d矩阵> <镜像线>)
  137.           (xdrx_matrix_setMirror <2d矩阵> <镜像面>)
  138.          
  139. 返回值:矩阵

  140. 说明:对2D矩阵,点都要给2D点。
  141.       [镜像线]-- (线起点 线终点)
  142.       [镜像面]-- (点1 点2 点3)  满足右手定则的时针顺序3个点表示一个平面。
  143.       
  144. 例子:

  145. Command: !a
  146. ((1.0 0.0 0.0 -30937.9) (0.0 1.0 0.0 -9817.43) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0 1.0)) ;矩阵
  147. Command: !l
  148. ((2922.82 -2479.0 0.0) (8768.45 7657.35 0.0)) ;;线
  149. Command: (setq c (xdrx_matrix_setmirror a l)) ;;镜像
  150. ((-0.500844 0.865537 0.0 -24405.6)
  151. (0.865537 0.500844 0.0 -13584.6)
  152. (0.0 0.0 -1.0 0.0)
  153. (0.0 0.0 0.0 1.0)
  154. )

  155. 309. xdrx_matrix_Projection

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

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

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

  159. 说明:<投影平面>--3点定的一个平面,遵循右手法则,时针方向不在一条直线上的三点(点 点 点)
  160.       <投影方向>--向量(点表示)
  161.       
  162. 310. xdrx_matrix_Wcs2Plane
  163.                                                                                                 
  164. 给未来版本保留
  165.                                                                                                                            
  166. 311. xdrx_matrix_Plane2Wcs     
  167.                                                                                             
  168. 给未来版本保留         

  169. 312. xdrx_matrix_Transpose

  170. 功能:获得一个矩阵的转置矩阵

  171. 调用格式:(xdrx_matrix_Transpose <2d or 3d矩阵>)

  172. 返回:转置后的矩阵

  173. 313. xdrx_matrix_IsSingular

  174. 功能:判断一个矩阵是否是一个奇异矩阵

  175. 调用格式:(xdrx_matrix_IsSingular <2d or 3d矩阵>)

  176. 返回:是T 否NIL

  177. 说明:使用getCoordSys获得矩阵坐标系的三个向量X,Y,Z轴,其中有一个轴向量
  178.       长度为0,既是奇异矩阵。
  179.       
  180. 314. xdrx_matrix_Translation

  181. 功能:获得一个矩阵的平移分量

  182. 调用格式:(xdrx_matrix_Translation <2d or 3d矩阵>)

  183. 返回值:向量

  184. 315. xdrx_matrix_SetTranslation

  185. 功能:设置一个矩阵的平移向量

  186. 调用格式:(xdrx_matrix_SetTranslation <2d or 3d矩阵> <平移向量>)

  187. 返回值:矩阵

  188. 说明: <平移向量>--对2D矩阵,是2D 向量
  189.                    对3D矩阵  是3D 向量
  190.                   
  191. 316. xdrx_matrix_IsEqual

  192. 功能:判断两个矩阵是否相等。

  193. 调用格式:(xdrx_matrix_IsEqual <2d or 3d矩阵> <2d or 3d矩阵>)

  194. 返回值:相等T 否NIL

  195. 317. xdrx_matrix_Product

  196. 功能:两个矩阵相乘

  197. 调用格式:(xdrx_matrix_Product <2d or 3d矩阵> <2d or 3d 矩阵>)                     

  198. 返回值:矩阵

  199. 318. xdrx_matrix->Local

  200. 功能:获得矩阵本身的NORMAL向量(坐标系Z轴)和ELEV高度值

  201. 调用格式:(xdrx_matrix->Local <三维矩阵>)

  202. 返回值:表(normal向量 elev)

  203. 319. xdrx_matrix_IsScaledOrtho

  204. 功能:测试一个矩阵的每个线性向量是否彼此正交

  205. 调用格式:(xdrx_matrix_IsScaledOrtho <2d or 3d矩阵>)

  206. 返回值:是 T 否 NIL

  207. 320. xdrx_matrix_IsUniScaledOrtho

  208. 功能:测试一个矩阵测试一个矩阵的每个线性向量是否彼此正交并且有至少有
  209.      两个向量长度相等。
  210.      
  211. 返回值:满足 T 否 NIL     

  212. 321. xdrx_matrix_Norm

  213. 功能:求三维转换矩阵绝对值最大的元素值

  214. 调用格式:(xdrx_matrix_Norm <三维矩阵>)

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

使用道具 举报

发表于 2002-8-6 13:48:49 | 显示全部楼层
也可作出圆柱后 align 么。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-8-6 14:12:53 | 显示全部楼层
如果杆件的方向太多,align 没什么实际意义。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2002-8-6 17:47:55 | 显示全部楼层
在晓东和qun的帮助下,问题已经解决,不妨把这个程序拿出来给大家共享:

  1. ;;向量单位化
  2. (defun nmlz(p1 p2 / x y z sum)
  3.   (setq x (- (car p2) (car p1)) y (- (cadr p2) (cadr p1)) z (- (caddr p2) (caddr p1))
  4.         sum (sqrt (+ (* x x) (* y y) (* z z)))
  5.   )
  6.   (if (zerop sum) '(0 0 0) (list (/ x sum) (/ y sum) (/ z sum)))
  7. )
  8. ;;按空间直线生成圆柱
  9. (defun mkcir(e / p1 p2 p21 w)
  10.   (setq w 1)
  11.   (setq e (entget e) p1 (cdr (assoc 10 e)) p2 (cdr (assoc 11 e)) p21 (nmlz p1 p2) p10 (trans p1 1 p21)
  12.         e (list '(0 . "CIRCLE") '(100 . "AcDbEntity") '(67 . 0) (assoc 8 e) '(100 . "AcDbCircle")
  13.                  (cons 39 (distance p1 p2)) (cons 10 p10) (cons 40 w) (cons 210 p21))
  14.   )
  15.   (entmake e)
  16. )

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-8-6 18:44:52 | 显示全部楼层
借着小鱼的帖子,给大家写篇如果利用“图形学”矩阵转换方法,得到“三维空间的圆实体”的组码10和拉伸向量210组码。

先贴个背景材料:

CIRCLE实体的entget里面,点是按照ECS(实体座标系)储存的,
ECS定义如下:
  1、ECS的Z轴与绘制图的平面正交,也被称为“法向”,由圆的Normal属性返回(DXF里面是组码210)

  2、世界坐标系的原点(0,0,0)也是ECS的原点

  3、ECS的X轴通过“任意轴”算法,从ECS的Z轴算出。

  4、ECS的Y轴是通过ECS的Z轴和X轴向量“叉集”得到。

下面谈谈“任意轴”算法(仅根据ECS法线向量得到ECS的X轴、Y轴的方法):

平面实体的法向向量定义了ECS的Z方向,但是仅仅规定了图形画板表面的方向,而不是它的位置。无限数量的平行平面共享一个法向。为了定义一个唯一的座标系,任意轴算法规定:ECS的原点总是必须和WCS的原点一致。这样就消除了所有平行的平面,而只留下其中一个。

现在剩下的就是确定平面中用到的其余的轴-X和Y的方向,这三个轴相互垂直,所以一旦确定了X轴,那么Y轴也很容易得到了。

如果通过Z轴获得X轴呢?AUTOCAD使用了一个名为“任意轴算法”(arbitrary axis algorithm)的技巧。因为唯一需要的参数是Z轴,所以对于AUTOCAD来说,计算X轴不成问题(把Z轴向量垂直就得到了),问题是对于给定的一个法线,总是必须计算出同样的X轴来。因此,轴可以是任意的,但是计算出来的X轴必须是唯一的,采用的方法如下:

  1. [FONT=courier new]
  2.    ECS_X=WCS_Z  x  ECS_Z  (x 表示两个向量差集,下同)
  3. [/FONT]
复制代码

在上面公式中,WCS_Z是WCS的Z轴(0,0,1)是固定的。但是有个问题:如果法向(ECS_Z)等于或很接近于WCS的Z轴(WCS_Z)怎么办?(两个向量很接近到计算机识别的误差内后,两个向量差集就会有意外结果),所以必须增加判断语句,利用WCS_Y轴(0,1,0):

  1. [FONT=courier new]
  2.    if ESC_Z is close to WCS_Z
  3.          then
  4.             ECS_X=WCS_Y x  ECS_Z
  5.         else
  6.             ECS_X=WCS_Z x  ECS_Z

  7. [/FONT]
复制代码

现在定义“is close to”是什么意思。“任意轴算法”如下定义:
(-e < ECS_Z[X] < e) and (-e < ECS_Z[Y] < e)

上面式子说明如果两个向量(轴)是接近的,那么它们法向向量的X,Y分量小于e,一个临界值。e 值被定义为:0.015625=1.0/64.0,它是在数值和二进制格式下所能显示的最精确的值,因此它能被用来在任何支持数学运算的计算机上所得到的快速而准确的值。

一旦知道了X,Y,Z轴和原点,那么就很容易的在不同的座标系进行变换。

上面讲了关于“圆实体的ECS定义和任意轴的算法”,所以,如果我们能够得到ECS的座标系,那么就可以把WCS下的点转换到ECS下面,下面的帖子将对小鱼的例子进行探索...

下面给大家一个函数,可以通过实体的210组码的法线矢量,得到圆实体的ECS的X,Y,Z轴向量:


  1. [FONT=courier new]
  2. (defun xdrx_matrix_getecs (normal / ecs_x ecs_y)
  3.   (setq normal (xdrx_vector_Normalize normal))
  4.   (if (and
  5.         (< (abs (car normal)) (/ 1 64.0))
  6.         (< (abs (cadr normal)) (/ 1 64.0))
  7.       )
  8.     (setq ecs_x (xdrx_vector_Normalize (xdrx_vector_CrossProduct '
  9.                                                                  (0 1 0)
  10.                                                                  normal
  11.                                        )
  12.                 )
  13.     )
  14.     (setq ecs_x (xdrx_vector_Normalize (xdrx_vector_CrossProduct '
  15.                                                                  (0 0 1)
  16.                                                                  normal
  17.                                        )
  18.                 )
  19.     )
  20.   )
  21.   (setq ecs_y (xdrx_vector_CrossProduct normal ecs_x))
  22.   (list ecs_x (xdrx_vector_Normalize ecs_y) normal)
  23. )
  24. [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-8-6 19:43:59 | 显示全部楼层

                               
登录/注册后可看大图


目的:用LISP的ENTMAKE根据已知的三维空间的线,生成一个三维空间的任意的圆实体
先用ACAD交互的方法,绘制一个我们以后要用LISP生成的三维空间的圆实体。得到数据定义供以后测试比较。
用生成圆,圆心和法线是两个很重要的数据。


命令: (entget (entlast)) ;;上面图中最终通过ACAD交互画得得圆实体的数据定义
((-1 . <图元名: 400a9c28>) (0 . "CIRCLE") (330 . <图元名: 400a9d18>) (5 . "7D")
(100 . "AcDbEntity") (67 . 0) (410 . "Model") (8 . "0") (62 . 2) (100 .
"AcDbCircle") (39 . 5.91608) (10 1.20049 2.63796 2.36643) (40 . 1.0) (210
0.845154 0.507093 0.169031)
)

下面我们的任务就是如何通过已知的三维空间直线,得到上面的圆实体关键数据组码10和210

首先,我们得的法线210组码值的过程:


命令: (setq normal (mapcar '- p2 p1))  ;;p2直线终点,p1直线起点,获得要画圆的法线向量
(5.0 3.0 1.0)

命令: (setq normal (xdrx_vector_normalize normal)) ;;向量单位化
(0.845154 0.507093 0.169031)

可见,我们得到了法线,结果和交互画出的圆的210组码值相同。

下面我们探索如何获得关键的圆心的ECS座标值,原理是先得到圆实体的ECS座标系,然后把世界座标系LINE
的起点(圆的圆心)座标转换到圆实体的ECS下面,过程如下:


命令: (setq ecs (xdrx_matrix_getecs normal))  ;;通过法线向量,获得圆实体的ECS的X,Y,Z轴向量
((-0.514496 0.857493 0.0) (-0.144943 -0.0869657 0.985611) (0.845154 0.507093
0.169031))

命令: (setq wcs (list (1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0)))
((1.0 0.0 0.0) (0.0 1.0 0.0) (0.0 0.0 1.0)) ;;WCS下的X,Y,Z轴向量

命令:(setq src (cons '(0 0 0) wcs)) ;;构建WCS座标系原点和轴数据
((0 0 0) (1.0 0.0 0.0 0.0) (0.0 1.0 0.0 0.0) (0.0 0.0 1.0 0.0) (0.0 0.0 0.0
1.0))

命令: (setq dest (cons '(0 0 0) ecs));;构建圆实体ECS座标系原点和轴数据
((0 0 0) (-0.514496 0.857493 0.0) (-0.144943 -0.0869657 0.985611) (0.845154
0.507093 0.169031))

命令: (setq tt (xdrx_matrix_aligncoordsystem dest src));;构建ECS座标系到WCS座标系的转换矩阵
((-0.514496 0.857493 0.0 0.0) (-0.144943 -0.0869657 0.985611 0.0) (0.845154
0.507093 0.169031 0.0) (0.0 0.0 0.0 1.0))

命令: (setq pp1 (xdrx_point_transform p1 tt)) ;;把转换矩阵作用到直线起点P1上
(1.20049 2.63796 2.36643)

(1.20049 2.63796 2.36643)可以看到这个结果和我们开始交互画的圆的组码10是一致的。


上面我们获得了要画"空间圆"的关键数据圆心在ECS下的座标,和拉伸向量组码210的值,我们就可以利用LISP的ENTMAKE函数
轻松的建立实体了(这样的方法很快,不用使用UCS命令来来回切换座标系,对于复杂的三维空间的操作提高了速度)

上面是通过图形学的原理,利用XDRX_API关于矩阵操作的函数进行的探索,矩阵在ACAD数据库中起的作用是非常巨大的,图形学
离不开矩阵变换,如果我们能把一种应用(比如移动、旋转、镜像、COPY或者这些操作的组合)的转换矩阵构建出来,问题也就
解决了。把矩阵作用到点上,就可以把点在不同坐标系下变换,作用到实体上,就会对实体变换,在ACAD内部,不知道什么是移动、拷贝
旋转、镜像、投影变换等等,知道的只是一个对象和一个要对对象操作的变换矩阵。大家掌握了矩阵的方法,很多应用都可以得心应手。

XDRX_API提供了ObjectARX几何库关于向量和矩阵操作的所有方法,也提供了对几何对象(点等)和数据库对象进行变换的方法,
比如:得到矩阵后,用xdrx_point_transform可以变换点,xdrx_entity_transfrom可以对实体变换,xdrx_entity_transfromedcopy对实体
进行COPY变换(原实体不变),这些都是最底层的ARX方法,无论是效率和方便性上,使用XDRX_API都可以让你使用ARX的方法和
思维去写LISP程序。

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

使用道具 举报

 楼主| 发表于 2002-8-7 09:32:52 | 显示全部楼层
总算领略了XDRX_API的厉害,更对XD的广告本领佩服的五体投地:)
其实在点的变换当中,利用TRANS还是比自己写函数要方便一些。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2002-8-7 10:17:05 | 显示全部楼层
最初由 漏网之鱼 发布
[B]总算领略了XDRX_API的厉害,更对XD的广告本领佩服的五体投地:)
其实在点的变换当中,利用TRANS还是比自己写函数要方便一些。 [/B]


上面仅仅是利用这个应用,简单的介绍了矩阵的应用,上面可以说是深入到了TRANS的内部,但是很多时候不是TRANS能解决问题的。ACAD的图形,每个地方都能体现到矩阵的作用。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2002-8-24 23:27:36 | 显示全部楼层
再举例好吗
直线为任意空间的多义线
圆改为任意空间的多义线
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-26 12:48:09 | 显示全部楼层

[求助]:[求助]:如何沿着PL线、圆,弧,空间曲线、折线等创建条块、圆管?

我经常用CAD建模,遇到建网架的时候就感到非常麻烦。请各位大侠帮我编一个程序,用来沿着PL线、圆,弧,空间曲线、折线等创建条块、圆管。这里说指的“条块”,实际上就是矩形截面(也可以是正方形)。我希望只要输入圆的半径、矩形的边长,然后点击(或框选)事先准备好的PL线、圆,弧,空间曲线、折线,就直接生成圆管和“条块”。
另外,要是能编一个程序,在线与线的交点处直接生成球体(网架焦点处的球体),就更好了。
谢谢,拜托!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-27 11:00:28 | 显示全部楼层
这里,3dpipe,从书上超来的,用空间路径建立3d弯管。你问题解的超集。

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

使用道具 举报

发表于 2003-5-29 10:28:26 | 显示全部楼层

  1. ;;最近很忙先给你挤出圆管程序<FOR 2D ONLY>
  2. ;;by LUCAS(龙龙仔)
  3. (vl-load-com)
  4. (arxload "geom3d.arx" NIL)
  5. (defun C:VV (/ ENAME VL-OBJ X RAD SPT EPT ENT)
  6.   (setq        ENAME  (car (entsel "\n选取挤出路径: "))
  7.         VL-OBJ (vlax-ename->vla-object ENAME)
  8.   )
  9.   (setq        X (vlax-curve-getparamatpoint
  10.             VL-OBJ
  11.             (vlax-curve-getpointatparam
  12.               VL-OBJ
  13.               (vlax-curve-getparamatdist
  14.                 VL-OBJ
  15.                 0
  16.               )
  17.             )
  18.           )
  19.   )
  20.   (setq        RAD (getdist (setq SPT (vlax-curve-getstartpoint VL-OBJ))
  21.                      "\n半径: "
  22.             )
  23.   )
  24.   (command "_.circle" SPT RAD)
  25.   (setq ENT (entlast))
  26.   (setq
  27.     EPT        (polar SPT
  28.                (+ (/ pi 2)
  29.                   (angle '(0 0 0) (vlax-curve-getfirstderiv VL-OBJ X))
  30.                )
  31.                0.001
  32.         )
  33.   )
  34.   (rotate3d ENT SPT EPT 90)
  35.   (command "_.extrude" ENT "" "p" ENAME)
  36.   (princ)
  37. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2003-5-29 15:28:06 | 显示全部楼层
to   LUCAS:
谢谢,您的程序是好使的。
只是--只能点选,不能框选(一次选择多个,然后确定直径)。能否改进一下?
期待着您的“条块”和“球节点”程序。
===========================
对不起,在使用过程中,发现您的程序有两个小小的问题:
1、受UCS的限制。当UCS变化时,圆管不能生成,或者生成的圆管不再路径直线上;
2、用“样条曲线”为路径生成圆管时,半径不一致,圆钢管中段有“鼓肚”的现象(中见段比两端粗)。
望予以解决,谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 21:15 , Processed in 0.219535 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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