林霄云 发表于 2014-5-7 21:40:12

CAD绘图初始化探讨与setup函数解析

CAD绘图初始化探讨暨setup函数解析
在前文中,出现大量的setup函数,这个究竟做了什么事情。首先得探讨一下绘图初始化。
墙线绘制源码解析(支持UCS,偏心或居中布置,厚度设置,自动填充)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109989&fromuid=7303580

绘图初始化
结构绘图,有线型,文字样式,标注样式,图层的统一要求。(为何统一,自行领悟)
是故,初始化首要问题是处理线型,文字,标注,图层的设置。其次才是CAD操作的变量设置,比如取消捕捉z坐标值osnapz=1。;设置主程序
(defun C:init()
(vl-load-com)
(setvar "cmdecho" 0)
(ShaDu)
(setup_G_hei)
(terpri)
(setup_G_text)
(terpri)
(setup_LineType)
(terpri)
(setup_layers)
(terpri)
(setup_G_DS_100)
(terpri)
)
1,文字样式
为三种,黑体用于图名,宋体用于图签,仿宋用于其他; 设置当前文字样式-黑体
(defun setup_G_hei ()
(if ( = (tblsearch "style" "黑体") nil)
(command "style" "黑体" "SIMHEI.TTF" "0" "0.8" "" "" "" ))

(princ "黑体为当前文字样式")
(princ)
)重要且各个公司不一致的地方在这个shx字体的设置,_bxsz.shx,_bxfs.shx分别问字母数字与大字体。各位务必根据实际使用情况修改。; 设置当前文字样式
(defun setup_G_text ()
(if ( = (tblsearch "style" "G_text") nil)
(command "style" "G_text" "_bxsz.shx,_bxfs.shx" "0" "0.7" "" "" "" ""))

(princ "G_text为当前文字样式")
(princ)
)而通用函数提供make_textstyle是使用entmake函数,不具备command函数的当前设置功能。

2,线型
线型主要是针对虚线,轴线,和复杂线型的设置。不同的图纸比例对应不同线型的比例。
线型设置是比较复杂的,一般人不要懂。讲了也是无用。
代码步骤为:1,无线型时,加载。2,加载仍无时,修改线型文件,创建线型再加载。3,普通线型和复杂线型创建方式有区别。(defun setup_LineType()
    (setvar "ltscale" 1000);确保lts为1000,当按1:100出图时
(mapcar '(lambda(ltname ltdetail ltdefine);参数为三个,名称,说明,格式
(if ( = (tblsearch "LTYPE" ltname) nil)
    ;当前列表没有ltname,尝试加载之
    (progn
      (setq acadlinPath (findfile "acad.lin"))
      (if acadlinPath
(command "linetype" "l" ltnameacadlinPath ""))

    ;加载后,再次检测
   (if ( = (tblsearch "LTYPE" ltname) nil)
   ;还是没有,则创建线型。
   (progn
         (command "linetype" "c" ltnameacadlinPath ltdetail ltdefine "")
;创建线型后加载之。
          (command "linetype" "l" ltnameacadlinPath "")
         
       );progn
       );if
      
    );progn

);if
(princ ltname);输出加载线型
);lambda
   '("_DASHED100" "_AXIS100" )
   '("_DASHED100 -- -- -- -- -- -- -- -- -- --" "_AXIS100 _________________._________________" )
   '("0.3,-0.1" "2.5,-0.1,0.25,-0.1" )
);mapcar
      ;*A_LINE,---- A ---- A ---- A----
      ;A,.75,-.125,["A",黑体,S=0.25,R=0.0,X=-0.085,Y=-0.125],-.125
;复杂线型加载

(mapcar '(lambda(ltname ltdetail ltdefine);参数为三个,名称,说明,格式
(if ( = (tblsearch "LTYPE" ltname) nil)
      ;当前列表没有ltname,尝试加载之
    (progn
      (setq acadlinPath (findfile "acad.lin"))
      (if acadlinPath
(command "linetype" "l" ltnameacadlinPath ""))

    ;加载后,再次检测
   (if ( = (tblsearch "LTYPE" ltname) nil)
   ;还是没有,则创建线型。
   (progn
         (setq f (open acadlinPath "a") )
   (write-line ltdetail)
   (write-line ltdefine)
   (close f)

;创建线型后加载之。
          (command "linetype" "l" ltnameacadlinPath "")
         
       );progn
   );if
);progn
);if
       (princ ltname);输出加载线型
);lambda
    '("A_LINE" )
    '("*A_LINE,---- A ---- A ---- A----" )
    '("A,.75,-.125,[\"A\",黑体,S=0.25,R=0.0,X=-0.085,Y=-0.125],-.125")
);mapcar
);defun

;创建线型后,必须进行加载才能使用该线型。

;不能使用 LINETYPE 命令创建复杂线型。3,标注样式
不是很多人懂标注样式里的设置。让人觉得相当遗憾。
我想多说几句,又觉多说无益,还是自行领悟吧!然,必须强调的是,文字是符号性的东西,与图纸比例相关。
举个例子:让人比较容易理解的设置是,比如,文字高度设为3,将全局比例设为100,如此,文字高度为300。出图效果为3mm(图纸比例为1:100时),还有一个测量比例因子。详本人文章智能生成标注样式一文,标准化标注源码解析与测试(支持UCS,智能标注样式)http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109241&fromuid=7303580

4,图层
图层包括设置与调用(指设为当前)。一般图层名为较为复杂的名称如"G-AXIS(主轴线)"
调用时,使用别名,是比较合适的,如去掉前缀与中文解释后的axis。
使用entmake生成图层(defun make_layer(layername code-6 code-62 code-370)
(if (null (tblobjname "LAYER" layername) )
(entmake (list '(0 . "LAYER")
      '(100 . "AcDbSymbolTableRecord")
      '(100 . "AcDbLayerTableRecord")
      '(70 . 0)
    (cons 2 layername)
      (cons 6 code-6)   ;线型Continuous
       (cons 62 code-62);颜色
    (cons 370 code-370);线宽,整数,50表示0.50 9表示0.09
      )
    )
);if
);defun而我常用的调用函数即setup为(defun   setup(layerAlias)
(setq layerAliases_list '("AXIS""AXIS_TEXT""LABEL""SLAB_HATCH""STAIR""TABLE""TITLE""AZ""AZ_HATCH""AZ_TEXT"
"BAR""BAR_P""BAR_TEXT""BEAM_BAR""BEAM_IN""BEAM_OUT""BEAM_TEXT""CBEAM_TEXT""CBEAM_BAR"
"COL""COL_HATCH""COL_TEXT""COL_U""CAP""CP_TEXT""DIM_IN""DIM_OUT""GZ""GZ_HATCH"
"GZ_TEXT""OUTLINE""PILE""PILE_X""SLAB_BAR_HATCH""SLAB_OUT""SLAB_TEXT""SYMBOL""TEXT""REFER"))

(setq layer_list '("G-AXIS(主轴线)""G-AXIS_TEXT(轴线号)""G-LABEL(引线)""G_SLAB_HATCH(板填充)""G-STAIR(楼梯)""G-TABLE(表格线)""G-TITLE(标题)""G_AZ(暗柱)""G_AZ_HATCH(暗柱填充)""G_AZ_TEXT(暗柱号)"
"G_BAR(钢筋)""G_BAR_P(点钢筋)""G_BAR_TEXT(钢筋文字)""G_BEAM_BAR(梁筋文字)""G_BEAM_IN(梁虚线)""G_BEAM_OUT(梁实线)""G_BEAM_TEXT(梁截面文字)""G_CBEAM_TEXT(次梁截面文字)""G_CBEAM_BAR(次梁钢筋文字)"
"G_COL(墙柱)""G_COL_HATCH(墙柱填充)""G_COL_TEXT(墙柱号)""G_COL_U(下层墙柱)""G_CAP(承台)""G_CP_TEXT(承台及桩号)""G_DIM_IN(内尺寸)""G_DIM_OUT(主尺寸)""G_GZ(构造柱)""G_GZ_HATCH(构造柱填充)"
"G_GZ_TEXT(构造柱号)""G_OUTLINE(外轮廓线)""G_PILE(桩)""G_PILE_X(桩心)""G_SLAB_BAR_HATCH(板配筋填充)""G_SLAB_OUT(板分界)""G_SLAB_TEXT(板号及板厚)""G_SYMBOL(符号)""G_TEXT(文字)""G_REFER(索引)"))

(setq color_list '("9""255""3""11""2""3""1""3""8""2"
"20""3""2""2""7""2""2""40""40"
"6""8""2""150""7""2""1""1""4""1"
"2""2""2""3""11""203""2""3""2""3")
)

(setq linetype_list '("_AXIS100""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""_DASHED100""CONTINUOUS""CONTINUOUS"
"CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""_DASHED100""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS"
"CONTINUOUS""CONTINUOUS""CONTINUOUS""_DASHED100""_DASHED100""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS"
"CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS""CONTINUOUS"))

(setq linewidth_list '("0.13""0.3""0.13""0.13""0.13""0.13""0.13""0.13""0.13""0.25"
"0.5""0.13""0.25""0.25""0.25""0.25""0.25""0.25""0.25"
"0.45""0.13""0.25""0.45""0.25""0.25""0.13""0.13""0.45""0.13"
"0.13""0.25""0.25""0.13""0.13""0.25""0.25""0.13""0.25""0.13"))

(setq num (vl-position (strcase (vl-princ-to-stringlayerAlias)) layerAliases_list))
(if num
(progn
(setq layname (nth num layer_list))
;查找图层
(if ( = (tblsearch "LAYER" layname) nil)
   
    (progn
    (setq   laycolor(nth num color_list)
          linetype(nth num linetype_list)
          linewidth (nth num linewidth_list)   
          )

    ; (command   "layer"       "m"             layname
         ; "c"         laycolor          layname
         ; "l"         linetype         layname
         ; "lw"          linewidth      layname
   ; ""
    ; )
    (make_layer layname linetype (atoi laycolor) (fix (* 100 (atof linewidth))))
    (setvar "clayer" layname)
    );progn
    (setvar "clayer" layname)

);if
);progn
);if num
(princ)
);defun值得注意的是,entmake与command,对于在此的应用,其速度区别,并不会影响体验。且必须明白,线型设置是图层设置的前置条件。

其他
最后说一个修订云线命令,自动放在在非打印图层里。;修订云线RECloud Rectangle
(defun C:revr()
(command "layer"   "m"      "注释"
      "c"   "35"         "注释"
      "p"      "n"            "注释"
      ""
    )
(setq t1(getpoint "\n输入第一点"))
(setq t2(getcorner t1 "\n输入对角点"))
;(command "rectangle" "w" "50" t1 t2)
(setq oldplwid (getvar "PLINEWID" ))
(setvar "PLINEWID" 50)
(command "rectangle"t1 t2)
(command "revcloud" "a" "150" "450" "s" "c" "o" (entlast) "")
(setvar "PLINEWID" oldplwid)
(princ)
)这个绘图初始化,或许只是对我这种纯cad画结构图显得有用。也欢迎大家指正与补充,特免费奉送。

明_明 发表于 2014-10-20 13:45:34

谢谢分享。

自贡黄明儒 发表于 2014-5-7 21:45:54

赞一个,!

tender138 发表于 2020-9-7 10:11:06

CAD绘图初始化探讨与setup函数解析,赞一个,!

林霄云 发表于 2014-5-7 22:13:49

同时,也必须明白,文字样式设置,是复杂线型设置的前提。

429014673 发表于 2014-5-7 23:56:54

;;删除acaddoc.lsp是不是只删路径下面的呀,但很多这个文件都在附在DWG文件夹里面的.可能删不干净呀.

hao3ren 发表于 2014-5-8 09:41:07

呵呵,纯CAD画图的顶一下

林霄云 发表于 2014-5-8 10:35:30

429014673 发表于 2014-5-7 23:56 static/image/common/back.gif
;;删除acaddoc.lsp是不是只删路径下面的呀,但很多这个文件都在附在DWG文件夹里面的.可能删不干净呀.

那个比较初级,而且需要自动加载才有效。有专门介绍acaddoc.lsp清理一文,acaddoc.lsp病毒破防(重磅解析源码级别)
http://bbs.mjtd.com/forum.php?mod=viewthread&tid=109014&fromuid=7303580

林霄云 发表于 2014-5-8 19:24:01

(write-line ltdetail)
(write-line ltdefine)应为(write-line ltdetail f)
(write-line ltdefine f)

机械工程师 发表于 2014-5-9 13:24:49

不错,学习林兄大作。

清风明月名字 发表于 2014-5-18 16:06:46

谢谢楼主的分享,试用了,非常好,收藏备用了!

Zrrrrr 发表于 2014-5-18 17:02:55

不错不错,学习了~
页: [1] 2 3
查看完整版本: CAD绘图初始化探讨与setup函数解析