截断符号源码解析与测试(支持UCS,左击比例更改)
把箍筋拉筋统一符号命令更新完源码之后——拉筋箍筋符号源码解析与测试(支持UCS、形式切换、智能比例、统一命令)http://bbs.mjtd.com/forum.php?mo ... amp;fromuid=7303580
,总觉得还少了一个,对,就是截断符号了(网上有的,是我并不喜欢的对话框与输入)。
很简单的动态和逻辑,直接上主函数- (defun C:CSB( / pt1 pt2 ss num-pt );cut-Symbol 标高符号
- ;(while (setq pt1 (getpoint "第一点<exit>")) ;不需要循环
- ;(setq flag nil)
- (setq num-pt 0)
- (setq pt1 (getpoint "第一点<exit>"))
- (setq pt2 (getpoint pt1 "第二点"))
- (setq ss (cut_symbol pt1 pt2 num-pt))
-
- ;捕捉左键,进行缩放测试
- (prompt "\n比例不对?左击,1:25、1:50、1:100循环 or 右击、空格、回车键确认退出")
- (while (and (setq ptr (grread t 15 2))
- (not (and (= 2 (car ptr)); 键盘事件
- (or (= 13 (cadr ptr)) (= 32 (cadr ptr))) ;_Enter Space
- ))
- (not (or (= (car ptr) 11) (= (car ptr) 25)));_Mouse Right button
- ;flag
- )
- ;(redraw)
- (cond ((= (car ptr) 3);_Mouse Left button
- (if ss
- (progn (ss_delete ss)(setq num-pt (1+ num-pt)) (setq ss (cut_symbol pt1 pt2 num-pt))) ;切换标志,删除,生成
- ) ;左键进行循环,测试ss选择集方式可行。
- ))
- ;(cond ((= (car ptr) 2);键盘事件 ,支持撤销。但是觉得不需要。注释掉
-
- ;(if (or (= (ascii "U") (cadr ptr)) (= (ascii "u") (cadr ptr))) (if ss (progn (ss_delete ss) (setq flag (not flag)))))
- ;))
- );while
- ;捕捉左键,进行缩放测试
-
- ; );while
- (princ)
- );cs
- (princ "\nCSB Cut SymBol 截断符号命令加载成功\nDesigned by 林霄云 2014年2月18日")
- (princ)
cut_symbol函数就是简单的根据输入的点,采用一点点不值一哂的算法,生成截断符号。
主要的操作有,坐标变换以支持UCS,确定参数以支持不同比例,生成图层,生成简单多段线。- (defun cut_symbol(pt0 pt00 pt-num / ss mid-pt self-ang pt1 pt2 pt1a pt2a pt10 pt10a a d h temp-dis temp-list)
- ;函数cut-symbol(pt0 pt00 sc-flag),参数sc-flag 比例,当nil为1:100,否则为1:25,返回值,生成对象的选择集
- ;Desiged by 林霄云 2014年1月20日
- (setq ucszdir (trans '(0 0 1) 1 0 T ));生成OCS法向量
- ;(setq ang (angle '(0 0 0) (trans (getvar "UCSXDIR") 0 ucszdir)));生成UCS在OCS的角度,不通过组码,通过旋转实现
- (setq pt0 (trans (trans pt0 1 0) 0 ucszdir ));将插入点从UCS转WCS后转
- (setq pt00 (trans (trans pt00 1 0) 0 ucszdir ))
- (setq mid-pt (mid_point pt0 pt00))
- (setq self-ang (angle pt0 pt00))
- (setq pt-num (rem pt-num 3))
- ;pt-num 0
- (setq a (/ pi 3.0 )
- d 200
- h 150 )
- ;判断比例,按1:50与1:25考虑
- (if (= pt-num 1)
- (setq d 50
- h 37.5 ))
-
- (if (= pt-num 2)
- (setq d 100
- h 75 ))
-
- (setq pt1 (polar mid-pt (- self-ang pi) h))
- (setq pt10 (polar pt0 (- self-ang pi) d))
- (setq pt1a (polar mid-pt self-ang h))
- (setq pt10a (polar pt00 self-ang d))
- (setq pt2 (polar pt1 (- self-ang a ) h))
- (setq pt2a (polar pt1a (- self-ang pi a) h))
- (setq layername "G_SYMBOL(符号)")
- (make_layer layername "Continuous" 3 0)
- (setq temp-list (list pt10 pt1 pt2 pt2a pt1a pt10a))
- (setq ss (ssadd)) ;设置选择集
- (setq ss (ssadd (make_pline temp-list layername nil) ss))
- ;多线
- )
结果:实现目标,详附图。
|