论文部分内容阅读
前言:伴随着人们对建筑造型艺术要求的提高,加之钢结构具有良好韧性的特点,越来越多的弧线扭曲造型在钢结构建筑中得到了广泛应用,然而作为被大家广泛使用的cad 软件在扭曲的面的实体生成存在不足,给钢结构加工放样(钢结构详图)带来了难度,本文以在cad中实现扭曲面到扭曲实体的转化的一个思路,编写了扭曲面实体生成程序,为钢结构扭曲构件的详图提供了一种可以实现的思路。
程序特点: 本程序是应用简单易懂的lisp语言编写,加载运行方便实用,具有很强的可操作性;另外由于它在cad 中的生成过程是即时生成具有动画的效果具有很强的观赏性。
一、cad中3d曲面变3d实体的编程思路
1.把3d曲面的网面炸成单个的空间四边形面;
2.把单个四边形面的四个点读出,并形成两个三角形的面域;
3.沿同一方向拉伸三角形成实体(拉伸长度可根据你需要的函数控制);
4.重复1~3步,直到全部结束;
5.做并集;
6.其中网格的细蜜程度决定曲面的精确程度,也决定了运算需要的时间了.
二、程序源代码
(defun c:st()
(command "ucs" "w")
(setq cm(getvar "cmdecho") os(getvar "osmode")) (setvar "cmdecho" 0)
(setq bh(getint "请输入板厚:"))
(setq xf (car (entsel "请选择法线:")))
(if (= xf nil) (setq xf (car (entsel "請选择法线:"))))
(princ "请选择曲面:")
(setq ss (ssget '((0 . "3DFACE") )) )
(setq n (sslength ss))
(setq a 0)
(repeat n
(setq qm (ssname ss a))
(setq qm(entget qm))
(setq p10(cdr(assoc 10 qm)))
(setq p11(cdr(assoc 11 qm)))
(setq p12(cdr(assoc 12 qm)))
(setq p13(cdr(assoc 13 qm)))
(setvar "osmode" 0)
(command "3dpoly" p10 p11 p12 "c" )
(setvar "osmode" os)
(setq m1(entlast))
(command "region" m1 "")
(setq m1(entlast))
(jj p10 p11 p12 xf)
(setq cd (/ bh sinjj))
(command "LENGTHEN""t" cd xf "")
(command "extrude" m1 "" "p" xf "")
(setq t1(entlast))
(setvar "osmode" 0)
(command "3dpoly" p12 p13 p10 "c" )
(setvar "osmode" os)
(setq m2(entlast))
(command "region" m2 "")
(setq m2(entlast))
(jj p10 p11 p12 xf)
(setq cd (/ bh sinjj))
(command "LENGTHEN" "t" cd xf "" )
(command "extrude" m2 "" "p" xf "")
(setq t2(entlast))
(command "union" t1 t2 "" )
(setq a (+ a 1))
)
(setvar "cmdecho" cm)
(command "_union" "all" "")
(command "_shademode" "g")
)
(DEFUNjj( p0 p1 p2 fx / p3 p4 a b c x x0 x1 x2 x3 x4y y0 y1 y2 y3 y4 z z0 z1 z2 z3 z4 yy rr )
(setq p3(cdr(assoc 10 (entget fx)))p4(cdr(assoc 11 (entget fx))) )
(setq x0(car p0) y0(cadr p0) z0(last p0))
(setq x1(car p1) y1(cadr p1) z1(last p1))
(setq x2(car p2) y2(cadr p2) z2(last p2))
(setq x3(car p3) y3(cadr p3) z3(last p3))
(setq x4(car p4) y4(cadr p4) z4(last p4))
(setq a(- (* (- y1 y0) (- z2 z0)) (* (- y2 y0) (- z1 z0))))
(setq b(- (* (- z1 z0) (- x2 x0)) (* (- z2 z0) (- x1 x0))))
(setq c(- (* (- x1 x0) (- y2 y0)) (* (- x2 x0) (- y1 y0))))
(setq x(- x4 x3) y(- y4 y3) z(- z4 z3))
(setq yy(abs(+(* a x) (* b y) (* c z) )))
(setq rr(* (expt (+ (expt a 2) (expt b 2) (expt c 2) ) 0.5) (expt (+ (expt x 2) (expt y 2) (expt z 2) ) 0.5)))
(setq sinjj(/ yy rr)
三:结束语
在详图设计工作中我们经常会遇到一些重复性的绘制工作,或者人为不好操作的事件,这个时候我们可以借用autolisp来实现命令的集成,一次完成多个连续的命令,这样既节省了时间而且还有较高的精确度。
程序特点: 本程序是应用简单易懂的lisp语言编写,加载运行方便实用,具有很强的可操作性;另外由于它在cad 中的生成过程是即时生成具有动画的效果具有很强的观赏性。
一、cad中3d曲面变3d实体的编程思路
1.把3d曲面的网面炸成单个的空间四边形面;
2.把单个四边形面的四个点读出,并形成两个三角形的面域;
3.沿同一方向拉伸三角形成实体(拉伸长度可根据你需要的函数控制);
4.重复1~3步,直到全部结束;
5.做并集;
6.其中网格的细蜜程度决定曲面的精确程度,也决定了运算需要的时间了.
二、程序源代码
(defun c:st()
(command "ucs" "w")
(setq cm(getvar "cmdecho") os(getvar "osmode")) (setvar "cmdecho" 0)
(setq bh(getint "请输入板厚:"))
(setq xf (car (entsel "请选择法线:")))
(if (= xf nil) (setq xf (car (entsel "請选择法线:"))))
(princ "请选择曲面:")
(setq ss (ssget '((0 . "3DFACE") )) )
(setq n (sslength ss))
(setq a 0)
(repeat n
(setq qm (ssname ss a))
(setq qm(entget qm))
(setq p10(cdr(assoc 10 qm)))
(setq p11(cdr(assoc 11 qm)))
(setq p12(cdr(assoc 12 qm)))
(setq p13(cdr(assoc 13 qm)))
(setvar "osmode" 0)
(command "3dpoly" p10 p11 p12 "c" )
(setvar "osmode" os)
(setq m1(entlast))
(command "region" m1 "")
(setq m1(entlast))
(jj p10 p11 p12 xf)
(setq cd (/ bh sinjj))
(command "LENGTHEN""t" cd xf "")
(command "extrude" m1 "" "p" xf "")
(setq t1(entlast))
(setvar "osmode" 0)
(command "3dpoly" p12 p13 p10 "c" )
(setvar "osmode" os)
(setq m2(entlast))
(command "region" m2 "")
(setq m2(entlast))
(jj p10 p11 p12 xf)
(setq cd (/ bh sinjj))
(command "LENGTHEN" "t" cd xf "" )
(command "extrude" m2 "" "p" xf "")
(setq t2(entlast))
(command "union" t1 t2 "" )
(setq a (+ a 1))
)
(setvar "cmdecho" cm)
(command "_union" "all" "")
(command "_shademode" "g")
)
(DEFUNjj( p0 p1 p2 fx / p3 p4 a b c x x0 x1 x2 x3 x4y y0 y1 y2 y3 y4 z z0 z1 z2 z3 z4 yy rr )
(setq p3(cdr(assoc 10 (entget fx)))p4(cdr(assoc 11 (entget fx))) )
(setq x0(car p0) y0(cadr p0) z0(last p0))
(setq x1(car p1) y1(cadr p1) z1(last p1))
(setq x2(car p2) y2(cadr p2) z2(last p2))
(setq x3(car p3) y3(cadr p3) z3(last p3))
(setq x4(car p4) y4(cadr p4) z4(last p4))
(setq a(- (* (- y1 y0) (- z2 z0)) (* (- y2 y0) (- z1 z0))))
(setq b(- (* (- z1 z0) (- x2 x0)) (* (- z2 z0) (- x1 x0))))
(setq c(- (* (- x1 x0) (- y2 y0)) (* (- x2 x0) (- y1 y0))))
(setq x(- x4 x3) y(- y4 y3) z(- z4 z3))
(setq yy(abs(+(* a x) (* b y) (* c z) )))
(setq rr(* (expt (+ (expt a 2) (expt b 2) (expt c 2) ) 0.5) (expt (+ (expt x 2) (expt y 2) (expt z 2) ) 0.5)))
(setq sinjj(/ yy rr)
三:结束语
在详图设计工作中我们经常会遇到一些重复性的绘制工作,或者人为不好操作的事件,这个时候我们可以借用autolisp来实现命令的集成,一次完成多个连续的命令,这样既节省了时间而且还有较高的精确度。