风树
发表于 2014-7-1 20:13:31
sunnylhj 发表于 2014-7-1 19:52 static/image/common/back.gif
我也编写了一个(其实充其量也只能算是一个批处理),但也只能一个一个量,不过可以输出Excel!
我没看清你第一个图是四面体网格还是单纯用三角形组成的曲面,提供原图可能其他人更好帮你
风树
发表于 2014-7-1 20:19:04
sunnylhj 发表于 2014-7-1 19:50 static/image/common/back.gif
我只是普通的的幕墙设计员,对lisp只懂皮毛,工作常常遇到这种情况,而且一般都是用AutoCAD和Rhinoceros, ...
建议可以先不必要强调导出到excel,先说导出到excel或文本格式均可。
同时告诉大伙,你要导出成什么样的格式吧,就给你导出一个角度,你怎么知道它代表图上那两个面的夹角呢?
风树
发表于 2014-7-1 20:30:24
没看清第一个图,可能那还不是四面体网格,只是由三角形组成的实体表面
qjchen
发表于 2014-7-1 22:17:47
二面角 应该和两个面的 法线 夹角密切相关 (相等或者互补),可以用矢量点乘得到。
而面的法线可以用两边矢量的叉乘得到,所以,若楼主把题意说清楚的话,应该思路是比较直接的
liu_kunlun
发表于 2014-7-1 23:38:17
关键之关键,是要得到各三角形的顶点坐标,剩下只是简单的运算。所以,楼主有必要发一个样板CAD文件,供高手探索解决。
sunnylhj
发表于 2014-7-2 01:48:43
风树 发表于 2014-7-1 20:07 static/image/common/back.gif
你那第一个图只是单纯的一个区面吗?
是一个网面,炸散后就是3dface!
sunnylhj
发表于 2014-7-2 01:49:59
风树 发表于 2014-7-1 20:19 static/image/common/back.gif
建议可以先不必要强调导出到excel,先说导出到excel或文本格式均可。
同时告诉大伙,你要导出成什么样的格 ...
导出csv就行!
sunnylhj
发表于 2014-7-2 15:24:29
自己頂一下,別讓帖子沉了!
风树
发表于 2014-7-2 16:34:54
本帖最后由 风树 于 2014-7-10 12:44 编辑
可能的解决途径:
1:未砸开前的网格曲面作为cad的一个实体类型,不知道在lisp中有没有提供相应的函数,直接或间接地处理各子单元相邻关系、提取各子单元的控制点坐标等,如果有就最好。
2:如果没有,曲面炸开后由3dface组成待处理的对象,下面的思路也许可行:
1-选择所有3dface实体,按序编号,
2-遍历实体,依次判断其周边哪些编号的实体和它邻边相接,记录下来,计算相应二面角;
关键语句是,如何根据3dface提取控制点坐标;如何通过一个3dface实体在图上提取可能和它相交的所有实体,以便相邻关系的确定;减少无用功
补充:
如果求得不是二面角,是两个三角形(面)临空面的交角,可能大于180度,该角
和外法线方向相关
涉及到由三角网构成的三维实体的内外空间如何定义的问题,
复杂实体内部空间的定义也许不能简单得用函数来表示,
常用的方法多见内部空间离散,用数据结构表示,
如果内部离散为多个四面体,则可以用四面体间的相互关系反推出求出
附一篇度娘提供的文档:http://m.doc88.com/p-7833709450305.html
这也是一个方向。
或者先求出二面角,再判断临空面方向上二面外角是否大于180度,或取值二面角获取值360-二面角
liu_kunlun
发表于 2014-7-2 22:18:53
本帖最后由 liu_kunlun 于 2014-7-2 22:51 编辑
赞助一段代码:
至于写入Excel已有很多文章
首先彻底炸开成3dface,然后运行下面代码....
(setq ss (ssget '((0 . "3DFACE"))))
(setq ie1 0)
(repeat (sslength ss)
(setq e1 (entget (ssname ss ie1)))
(mapcar 'set (list 'p1 'p2 'p3) (mapcar '(lambda (x) (dxf x e1)) '(10 11 12)))
(setq vz1 (v_i (v_xm (v_sub p2 p1)(v_sub p3 p2))))
(foreach sid (list (list p1 p2) (list p2 p3) (list p3 p1))
(if (or (setq sid2 (assoc sid sids))
(setq sid2 (assoc (reverse sid) sids))
)
(setq ie2 (nth 1 sid2) vz2 (nth 2 sid2)
angs (cons (list sid (angle '(0. 0. 0.) (list (v_pm vz1 vz2) (v_abs (v_xm vz1 vz2)) 0.))) angs)
sids (vl-remove sid2 sids)
)
(setq sids (cons (list sid ie1 vz1) sids))
)
)
(setq ie1 (1+ ie1))
)
;得到的angs为(((点 点)角度)....),其(点 点)代表边,角度单位为弧度
;;向量操作函数
(defun v_abs (v) (sqrt (apply '+ (mapcar '* v v))))
(defun v_i (v / a) (setq a (v_abs v)) (mapcar '(lambda (x) (/ x a)) v))
(defun v_add (v1 v2) (mapcar '+ v1 v2))
(defun v_pm(v1 v2) (apply '+ (mapcar '* v1 v2)))
(defun v_sub (v1 v2) (mapcar '- v1 v2))
(defun v_xm(v1 v2) (mapcar '- (mapcar '* v1 (append (cdr v2) (list (car v2))))
(mapcar '* v2 (append (cdr v1) (list (car v1))))
) )