yangist 发表于 2013-6-27 13:24:13

谁能根据eachy大神的思路编个根据线的总长度自动线型比例的程序呢

;;原创: eachy
1 首先要简单了解下线形的定义(转贴自联机帮助)
例如,名为 DASHDOT 的线型定义为
*DASHDOT,Dash dot __ . __ . __ . __ . __ . __ . __ . __
A,.5,-.25,0,-.25
这表示一种重复图案,以 0.5 个图形单位长度的划线开头,然后是 0.25 个图形单位
长度的空移、一个点和另一个 0.25 个图形单位长度的空移。 该图案延续至直线的全
长,并以 0.5 个图形单位长度的划线结束。 该线型如下所示。
__ . __ . __ . __ . __ . __ . __ . __
2 再看看联机帮助中的 DXF 组码中TABLE部分的LTYPE
40 图案总长度

49 虚线、点或空间长度(每个元素一个条目)
3 实际测试

以 HIDDEN 为例,Load Hidden 线形,然后
_$ (tblsearch "ltype" "hidden")
((0 . "LTYPE") (2 . "HIDDEN") (70 . 0) (3 . "Hidden __ __ __ __ __ __ __ __ __ __ __ __ __ _")
(72 . 65) (73 . 2) (40 . 9.525) (49 . 6.35) (49 . -3.175))
_$
再看Hidden定义
*HIDDEN,Hidden __ __ __ __ __ __ __ __ __ __ __ __ __ __
A, 6.35, -3.175
然后看看当前的 Ltscale
_$ (getvar "ltscale")
1.0
从中可以看到 Code 40 = Code 49 + (abs Code 49),也就是一个线形周期的总长度,
试着改变 Ltscale 为 3
_$ (setvar "ltscale" 3)
3
_$ (tblsearch "ltype" "hidden")
((0 . "LTYPE") (2 . "HIDDEN") (70 . 0) (3 . "Hidden __ __ __ __ __ __ __ __ __ __ __ __ __ _")
(72 . 65) (73 . 2) (40 . 9.525) (49 . 6.35) (49 . -3.175))
_$
可以看到图面的线形放大了,而 Table 中的 Hidden 是不变的,当然 *.lin 中的定义也没变
用Dist粗略测量一下这个图上实际周期长度和Ltscale的关系,可以得出
图上一个周期的长度 = Code 40 x Ltscale
这就可以用来方便控制线形比例了,我们不必关心Ltscale是多少,只要确定这个实际周期长度
就可以反算出 Ltscale了
根据上面的测试整理的代码,这就是某些专业软件中指定线形周期功能的 Lisp 实现,很简单的

(defun c:tt (/ e d el lay lt l)
(if (and (setq e (car (entsel "\n选择线形实体: ")));_不要选Continuous,没有意义
       (setq d (getdist "\n指定周期长度: "));_根据出图的大小确定或输入
      )
    (progn
      (setq el    (entget e)
      lay    (assoc 8 el)
      )
      (if (not (setq lt (cdr (assoc 6 el))));_ 如果指定了线形
    (setq lt (cdr (assoc 6 (tblsearch "layer" lay))));_ 线形是随层的
      )
      (setq l (cdr (assoc 40 (tblsearch "ltype" lt))));_
      (command ".ltscale" (/ d l));_计算需要的合适比例
    )
)
(princ)
)

nishuihanjian 发表于 2015-5-11 17:10:04

同求这个源程序,谢谢大神

guankuiwu 发表于 2021-6-16 16:44:22

学习一下了!
页: [1]
查看完整版本: 谁能根据eachy大神的思路编个根据线的总长度自动线型比例的程序呢