明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1814|回复: 8

三维线条展开

[复制链接]
发表于 2015-5-19 08:20 | 显示全部楼层 |阅读模式
50明经币
本帖最后由 夏生生 于 2015-5-19 08:21 编辑

恳请各位帮忙解决个问题,谢谢
一系列三角元组成的带状三维图形,将其展开为平面图形,起始点可设置为'(0. 0. 0.)和起始角为pi
例图如下



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

最佳答案

查看完整内容

自己胡乱解决掉了,谢谢大家,感谢高飞鸟版主的矩阵,程序中没有的函数均详见高飞鸟版主的http://bbs.mjtd.com/thread-99926-3-1.html
发表于 2015-5-19 08:20 | 显示全部楼层
自己胡乱解决掉了,谢谢大家,感谢高飞鸟版主的矩阵,程序中没有的函数均详见高飞鸟版主的http://bbs.mjtd.com/thread-99926-3-1.html
  1. (defun x_ssn (ss / n lst)
  2.   (repeat (setq N (sslength ss))
  3.     (setq LST (cons (ssname SS (setq N (1- N))) LST))
  4.   )
  5. )
  6. ;;;消重
  7. (defun deldup (ptLst alw / pt1)
  8.   (cond        ((<= (length ptLst) 1) ptLst)
  9.         (t
  10.          (setq pt1 (car ptLst))
  11.          (cons pt1
  12.                (vl-remove-if
  13.                  '(lambda (x) (equal pt1 x alw))
  14.                  (deldup (cdr ptLst) alw)
  15.                )
  16.          )
  17.         )
  18.   )
  19. )
  20. ;;;找重
  21. (defun finddup (l1 / l2)
  22.   (while l1
  23.     (if        (member (car l1) (cdr l1))
  24.       (setq l2 (append
  25.                  l2
  26.                  (list (car l1))
  27.                )
  28.       )
  29.     )
  30.     (setq l1 (vl-remove (car l1) l1))
  31.   )
  32.   l2
  33. )
  34. ;;;两两组表
  35. (defun buildlst        (lst / a lst1)
  36.   (while (> (length lst) 1)
  37.     (setq a (car lst))
  38.     (setq lst (cdr lst))
  39.     (setq lst1 (cons (mapcar '(lambda (x) (list a x)) lst) lst1))
  40.   )
  41.   (apply 'append (reverse lst1))
  42. )
  43. ;;;求交
  44. (defun inter (en1 en2)
  45.   (list        (inters        (get_dxf en1 10)
  46.                 (get_dxf en1 11)
  47.                 (get_dxf en2 10)
  48.                 (get_dxf en2 11)
  49.         )
  50.         en1
  51.         en2
  52.   )
  53. )
  54. ;;;截取组码
  55. (defun get_dxf (en num /) (cdr (assoc num (entget en))))
  56. ;;;反余弦
  57. (defun acos (y)
  58.    (atan (sqrt (abs(- 1 (* y y)))) y)
  59. )
  60. ;;;反正弦
  61. (defun asin (y)
  62.   (-(/ pi 2)(acos y))
  63. )
  64. ;;;表中删除表
  65. (defun del_lst (lstdel lst /)
  66.   (repeat (length lstdel)
  67.     (setq lst (vl-remove-if '(lambda (x) (= x (car lstdel))) lst)lstdel(cdr lstdel))
  68.   )
  69.   lst
  70. )
  71. ;;;共点则返回en2
  72. (defun andpoint        (en1 en2 /)
  73.   (if (or (equal (get_dxf en1 10) (get_dxf en2 10) 1e-6)
  74.           (equal (get_dxf en1 10) (get_dxf en2 11) 1e-6)
  75.           (equal (get_dxf en1 11) (get_dxf en2 10) 1e-6)
  76.           (equal (get_dxf en1 11) (get_dxf en2 11) 1e-6)
  77.       )
  78.     en2
  79.     nil
  80.   )
  81. )
  82. ;;;图元表变为点表
  83. (defun enlst->ptlst (enlst)
  84.   (deldup (append (mapcar '(lambda (x) (get_dxf x 10)) enlst)
  85.                   (mapcar '(lambda (x) (get_dxf x 11)) enlst)
  86.           )
  87.           1e-6
  88.   )
  89. )
  90. ;;;求两个面的夹角
  91. (defun angle_f&f (ptlst1 ptlst2 / pt1 pt2 pt3 v1 v2 abc def)
  92.   (setq        pt1 (car ptlst1)
  93.         pt2 (cadr ptlst1)
  94.         pt3 (caddr ptlst1)
  95.   )
  96.   (setq        v1 (MAT:v-v pt1 pt2)
  97.         v2 (MAT:v-v pt1 pt3)
  98.   )
  99.   (setq abc (MAT:vxv v1 v2))
  100.   (setq        pt1 (car ptlst2)
  101.         pt2 (cadr ptlst2)
  102.         pt3 (caddr ptlst2)
  103.   )
  104.   (setq        v1 (MAT:v-v pt1 pt2)
  105.         v2 (MAT:v-v pt1 pt3)
  106.   )
  107.   (setq def (MAT:vxv v1 v2))
  108.   (acos        (/ (MAT:Dot abc def)
  109.            (MAT:norm abc)
  110.            (MAT:norm def)
  111.         )
  112.   )
  113. )
  114. ;;;求线与面的夹角
  115. (defun angle_l&f (pta ptb ptlst / pt1 pt2 pt3 v1 v2 abc v)
  116.   (setq        pt1 (car ptlst)
  117.         pt2 (cadr ptlst)
  118.         pt3 (caddr ptlst)
  119.   )
  120.   (setq        v1 (MAT:v-v pt1 pt2)
  121.         v2 (MAT:v-v pt1 pt3)
  122.   )
  123.   (setq abc (MAT:vxv v1 v2))
  124.   (setq        v(MAT:v-v pta ptb))
  125.   (asin        (/ (abs(MAT:Dot abc v))
  126.            (MAT:norm abc)
  127.            (MAT:norm v)
  128.         )
  129.   )
  130. )
  131. (vl-load-com)
  132. (defun c:ttt (/        ss enlst lst facelst intlst en1        en2 en3        face1 face2 ang
  133.               pt v objlst)
  134.   (setq ss (ssget))
  135. ;;;(setq enlst(x_ssn ss))
  136. ;;;拷贝一个表
  137.   (setq        objlst (mapcar 'vla-copy
  138.                        (mapcar 'vlax-ename->vla-object (x_ssn ss))
  139.                )
  140.   )
  141.   (setq enlst (mapcar 'vlax-vla-object->ename objlst))
  142. ;;;将原始坐标赋予图元
  143.   (foreach n enlst
  144.     (vlax-ldata-put
  145.       "coordinate"
  146.       (vlax-ename->vla-object n)
  147.       (list (get_dxf n 10) (get_dxf n 11))
  148.     )
  149.   )
  150.   (setq lst enlst)
  151. ;;;取得第一图元
  152.   (setq en1 (car enlst))
  153.   (setq facelst nil)
  154. ;;;以下循环开始
  155.   (while (> (length enlst) 2)
  156. ;;;从表中删除第一个图元
  157.     (setq enlst (del_lst (list en1) enlst))
  158.     (if        (> (length enlst) 2)
  159.       (progn
  160. ;;;找出与第一个图元共点的图元
  161.         (setq
  162.           intlst
  163.            (vl-remove-if-not '(lambda (x) (andpoint en1 x)) enlst)
  164.         )
  165. ;;;两两组表
  166.         (setq intlst (mapcar '(lambda (x) (eval (cons 'inter x)))
  167.                              (buildlst intlst)
  168.                      )
  169.         )
  170. ;;;找到不相交的图元
  171.         (setq a (vl-remove-if '(lambda (x) (car x)) intlst))
  172. ;;;找到相交且交点不在第一图元端点的图元
  173.         (setq b        (vl-remove-if
  174.                   '(lambda (x)
  175.                      (or (equal (car x) (get_dxf en1 10) 1e-6)
  176.                          (equal (car x) (get_dxf en1 11) 1e-6)
  177.                      )
  178.                    )
  179.                   (del_lst a intlst)
  180.                 )
  181.         )
  182. ;;;取得第一面第二图元
  183.         (setq en2 (finddup (append (cdar a) (cdar b))))
  184. ;;;取得第二面第一图元亦即第一面第三图元
  185.         (setq en3 (del_lst en2 (cdar b)))
  186.         (setq facelst (cons (list en1 (car en2) (car en3)) facelst))
  187.         (setq enlst (del_lst en2 enlst))
  188.         (setq en1 (car en3))
  189.       )
  190.       (setq facelst (cons (cons en1 enlst) facelst))
  191.     )
  192.   )
  193.   (setq facelst (reverse facelst))
  194. ;;;循环开始
  195.   (while (> (length facelst) 1)
  196. ;;;求第二面与第一面夹角
  197.     (setq face1        (car facelst)
  198.           face2        (cadr facelst)
  199.     )
  200.     (setq ang (angle_f&f (enlst->ptlst face2) (enlst->ptlst face1))
  201.           pt  (get_dxf (car face2) 10)
  202.           v   (MAT:v-v (get_dxf (car face2) 11) pt)
  203.     )
  204.     (if        (> ang (/ pi 2))
  205.       (setq ang (- pi ang))
  206.     )
  207.     (if        (null (or (equal ang 0. 1e-6) (equal ang pi 1e-6)))
  208.       (mapcar '(lambda (x)
  209.                  (vla-transformby
  210.                    x
  211.                    (vlax-tmatrix
  212.                      (MAT:Rotation3D
  213.                        pt
  214.                        v
  215.                        ang
  216.                      )
  217.                    )
  218.                  )
  219.                )
  220.               (mapcar 'vlax-ename->vla-object (del_lst face1 lst))
  221.       )
  222.     )
  223.     (setq facelst (cdr facelst)
  224.           lst          (del_lst (list (car face1) (cadr face1)) lst)
  225.     )
  226.   )
  227. )
回复

使用道具 举报

发表于 2015-5-19 08:51 | 显示全部楼层
是否可以这样,取得所有线段图元名及两端点坐标((图元名 (0 0 0)(100 20 50))((图元名 ...))),按坐标排序,依次用一根线段两端点找相同点,如相同去该线另一端点测试,通过就按点位3维长度画平面图形,循环......
没详尽考虑,我的大概思路,还请e派、g版、z版......等大师出手
回复

使用道具 举报

 楼主| 发表于 2015-5-19 09:15 | 显示全部楼层
首先定端部面为初始面,将其移动并旋转至wcs(其它面一起相同转换矩阵移动旋转),图元表剔除初始面除面交线(黄色)外线,然后将第二面以面交线(黄色)旋转至wcs(其它面一起相同转换矩阵旋转),循环
回复

使用道具 举报

发表于 2015-5-29 11:49 | 显示全部楼层
楼主,代码能否给我完整的,我用了2楼的代码加上高飞鸟的函数可还是执行不了。
出现下面的错误:
(or stringp symbolp): #<VLA-OBJECT IAcadLine 31f67584>
先谢谢了。
回复

使用道具 举报

发表于 2015-5-29 11:56 | 显示全部楼层
楼主我有点有急用,您看看方便的话发个完整的好吗?
回复

使用道具 举报

发表于 2021-9-1 17:21 | 显示全部楼层
参数类型错误: (or stringp symbolp): #<VLA-OBJECT IAcadLine 00000199b95ce358>   一样的BUG
回复

使用道具 举报

发表于 2021-10-30 09:32 | 显示全部楼层
命令: TTT
选择对象: 指定对角点: 找到 9 个
选择对象:  ; 错误: 参数类型错误: (or stringp symbolp): #<VLA-OBJECT IAcadLine 0000023bf53d7d58>
回复

使用道具 举报

 楼主| 发表于 2021-10-30 15:40 | 显示全部楼层
抱歉,好久没用了,我自己都不知道我写的是什么东西了
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-4-19 07:53 , Processed in 0.296680 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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