Gu_xl 发表于 2011-12-24 21:57:13

【Gu_xl】自动提取AutoCAD 图形中填充图案的定义文件

本帖最后由 Gu_xl 于 2013-6-11 10:41 编辑

在有些时候,从别人处得到dwg图形,里面有非常漂亮的非标准填充图案方案,要想借用其图案是很困难的!
里面的非标准的填充图案,我们cad标准填充图案文件acad.pat或acadiso.pat文件有若没有该图案定义,这时想要对图案进行编辑和使用,也非常麻烦和不方便!一个好的办法是将图案定义提取出来,添加到acad.pat或acadiso.pat文件中!这一切烦恼的问题都不存在了!
在程序的编制过程中,得到了highflybird和caoyin两位版主的鼎力技术支持,在此表示感谢!


;;;c:getpat 提取填充图案 2011年12月24日 By 明经通道 Gu_xl
;;;若选取的图案文件已存在,自动追加或替换已有文件中图案
(defun c:getpat (/ ROTZ   RTOD   DXF      GETPATHmeasurement
   PATNAMEENT      FILENAME F1       FLAG
   ZC   PATDATAALLPATDATA      NAME
   HATCH    SCALE    ROT      ENL      NEWPATDATA
   ANG   X      Y       DX       DY
   DATA   N      L       K      STRDATA
   TMP   F
    )
;;;坐标绕Z轴顺时针旋转角度
(defun RotZ (ang x y / an)
    (setq an (- ang))
    (mapcar '(lambda (r) (apply '+ (mapcar '* r (list x y))))
   (list (list (cos an) (- (sin an)))
    (list (sin an) (cos an))
   )
    )
)
;;;字串分割
(defun gxl-StrParse (str del / pos lst)
(while (setq pos (vl-string-search del str))
    (setq lst (cons (substr str 1 pos) lst)
   str (substr str (+ pos 1 (strlen del)))
    )
)
(if (= " " Del)
    (vl-remove "" (reverse (cons str lst)))
    (reverse (cons str lst))
)
)

;;;弧度转度
(defun RtoD (dat /)
    (* 180.0 (/ dat pi))
)
;;;取组码值
(defun dxf (ent i)
    (cond ((= (type ent) 'ename)
   (cdr (assoc i (entget ent '("*"))))
      )
   ((= (type ent) 'list)
    (cdr (assoc i ent))
    )
    ) ;_ if
)
;;;计算路径
(defun getpath (/ tmp)
   (strcat (VL-FILENAME-DIRECTORY (findfile "acad.pat")) "\\")
    )
(princ "\n***提取填充图案 By 明经通道 Gu_xl***")
(setq measurement(getvar 'measurement)) ;_ 0 英制 1 公制
(cond
    ((= 0 measurement) ;_ 英制
   (setq patname (getenv "ANSIHatch"))
   )
    ((= 1 measurement) ;_ 公制
   (setq patname (getenv "ISOHatch"))
   )
    )
(while (and (setq ent (car (entsel "\n选择填充图案: "))) (= "HATCH" (dxf ent 0)))
    (setq filename (getfiled "选取图案文件" (strcat (getpath) patname)"pat" 1))
    (if filename
      (progn
(if (findfile filename)
    ;_ 若图案文件已存在,则生成的图案文件添加或替换到该图案文件
   (progn
   (setq f1 (open filename "r"))
   (setq flag nil)
   (while (setq zc (read-line f1))
       (cond
(flag
   (setq Patdata (append Patdata (list zc)))
   (while (and
   (setq zc (read-line f1))
   (/= "*" (substr (VL-STRING-RIGHT-TRIM " " zc) 1 1))
   (/= ";" (substr (VL-STRING-RIGHT-TRIM " " zc ) 1 1))
   )
   (setq Patdata (append Patdata (list zc)))
   )
   (setq AllPatdata (cons Patdata AllPatdata))
   (if (and zc (= "*" (substr (VL-STRING-RIGHT-TRIM " " zc ) 1 1)))
   (progn
       (setq Patdata (list (strcase (car (GXL-STRPARSE zc ","))) zc) Flag t)
       )
   (progn
      (setq flag nil)
      (if zc (setq AllPatdata (cons (list "注释" zc) AllPatdata)))
      )
   )
   )
((= ";" (substr (VL-STRING-RIGHT-TRIM " " zc ) 1 1))
   (setq AllPatdata (cons (list "注释" zc) AllPatdata))
   )
((= "*" (substr (VL-STRING-RIGHT-TRIM " " zc ) 1 1))
   (setq Patdata (list (strcase (car (GXL-STRPARSE zc ","))) zc))
   (while (and
   (setq zc (read-line f1))
   (/= "*" (substr (VL-STRING-RIGHT-TRIM " " zc) 1 1))
   (/= ";" (substr (VL-STRING-RIGHT-TRIM " " zc ) 1 1))
   )
   (setq Patdata (append Patdata (list zc)))
   )
   (setq AllPatdata (cons Patdata AllPatdata))
   (if (and zc (= "*" (substr (VL-STRING-RIGHT-TRIM " " zc ) 1 1)))
   (progn
       (setq Patdata (list (strcase (car (GXL-STRPARSE zc ","))) zc) Flag t)
       )
   (progn
      (setq flag nil)
      (if zc (setq AllPatdata (cons (list "注释" zc) AllPatdata)))
      )
   )
   )
)
       )
   (close f1)
   ;;;图案文件数据 '((图案名称 图案数据)
   (setq AllPatdata (reverse AllPatdata))
   (setq name (dxf ent 2)) ;_ 图案名称
   )
   (progn
    (setq AllPatdata nil) ;_ 图案文件数据置空
    (setq name (VL-FILENAME-BASE filename)) ;_图案名称同文件名
    )
   )

(setq hatch (vlax-ename->vla-object ent))
(setq scale (vla-get-PatternScale hatch);_ 填充比例
       Rot (vla-get-PatternAngle hatch) ;_ 填充角度
       )
(setq enl (entget (vlax-vla-object->ename hatch))
       enl (member (assoc 53 enl) enl)
)
(setq NewPatData (list (strcat "*" (strcase name)) (strcat "*" name "," name))) ;_ 储存填充数据表
(while (= 53 (caar enl))
   (setq ang (cdar enl) ;_ 53 图案直线角度
enl (cdr enl)
   )
   (setq x(dxf enl 43) ;_ 图案直线基点,X 分量
y(dxf enl 44) ;_ 图案直线基点,Y 分量
dx (dxf enl 45) ;_ 图案直线偏移,X 分量
dy (dxf enl 46) ;_ 图案直线偏移,Y 分量
   )
   (mapcar 'set (list 'dx 'dy) (RotZ ang dx dy))
   (mapcar 'set (list 'x 'y) (RotZ Rot x y))
   (setq data (list x y dx dy))
   (setq enl (member (assoc 79 enl) enl))
   (setq n   (cdar enl) ;_ 虚线长度项目数
enl (cdr enl)
   )
   (repeat n
   (setq l   (car enl) ;_ 虚线长度
    enl (cdr enl)
   )
   (setq data (append data (list (cdr l))))
   )
   (setq k 12) ;_ 数字取位精度
   ;;;图案定义最长不超过80个字符
   (while (> (strlen (setq strdata
       (apply
         'strcat
         (cons
         (rtos (RtoD (- ang Rot)) 2 k)
         (mapcar
      '(lambda (a) (strcat "," (rtos (/ a scale) 2 k)))
      data
         )
         )
       )
       )
      )
      80
   )
   (setq k (1- k))
   )
   (setq NewPatData (append NewPatData (list strdata)))
)
(if (setq tmp (assoc (strcat "*" (strcase name)) AllPatdata))
   (setq AllPatdata (subst NewPatData tmp AllPatdata))
   (setq AllPatdata (append AllPatdata (list NewPatData)))
   )
(setq f (open filename "w"))
(if f
   (progn
   (foreach a AllPatdata
       (if (= (car a) (strcat "*" (strcase name)))
(progn
    (write-line ";;" f)
    (write-line ";; 以下图案由Gu_xl图案提取程序自动提取生成" f)
    (write-line ";;" f)
    )
)
       (foreach b (cdr a)
(write-line b f)
)
       )
   (close f)
   ;(startapp "notepad.exe" filename)
   )
   (progn
   (alert (strcat filename "文件不能保存!线型文件为你保存在临时文件中!"))
   (setq filename (VL-FILENAME-MKTEMP "pat" "" ".pat"))
   (setq f (open flename "w"))
   (foreach a AllPatdata
       (foreach b (cdr a)
(write-line b f)
)
       )
   (close f)
   ;(startapp "notepad.exe" filename)
   )
   )
      )
    )
)
(princ)
)

测试样图:



http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 Gu_xl的微博
2011年12月25日更新
更新内容:可以批量提取图案,并增加是否更新已有图案选项!
2012.12.26日更新:根据caoyin版主的意见,增加考虑将填充图案基点修正到‘(0 0)为基点





atone 发表于 2023-4-17 10:50:04

atone 发表于 2023-4-17 10:48
我这样设置了快捷键,也保存了ini文件,快捷键不起作用或者叫CAD不识别

我想知道我是逻辑理解错了,还是有什么东西没有添加?

kucha007 发表于 2021-1-8 21:21:51

花了两天的时间逛明经,终于把发帖数攒到20了!!!下载来使用了一下,不要太好用!!!
那些求发邮箱的。朋友,这个插件还是源码,值得你为了它好好逛逛论坛。

guosheyang 发表于 2021-4-5 10:03:47

swb4420 发表于 2021-2-28 15:11
两个测试CAD提示图形文件无效。

fixmj.exe本版块搜索这个文件修复下即可

highflybir 发表于 2011-12-24 21:58:09

本帖最后由 highflybir 于 2011-12-24 22:15 编辑

占沙发。
不知道关于镜像后的填充图案是不是真的无解?

gbhsu 发表于 2011-12-24 22:01:10

本帖最后由 gbhsu 于 2011-12-24 22:01 编辑

坐板凳!!!!

cxs259 发表于 2011-12-24 22:03:51

鼓掌!!!!!!

highflybir 发表于 2011-12-24 23:39:47

GXL-STRPARSE 没有定义

仲文玉 发表于 2011-12-25 08:24:23

精品作品!支持!

Gu_xl 发表于 2011-12-25 09:43:28

highflybir 发表于 2011-12-24 23:39 static/image/common/back.gif
GXL-STRPARSE 没有定义

函数补上:

;;;字串分割
(defun gxl-StrParse (str del / pos lst)
(while (setq pos (vl-string-search del str))
    (setq lst (cons (substr str 1 pos) lst)
          str (substr str (+ pos 1 (strlen del)))
    )
)
(if (= " " Del)
    (vl-remove "" (reverse (cons str lst)))
    (reverse (cons str lst))
)
)

highflybir 发表于 2011-12-25 10:31:07

还有几点建议:

1、建议用measurement 系统变量
   ;;measurement
(setq MEASUREMENT (getvar 'MEASUREMENT)) ;_ 0 Ó¢ÖÆ 1 ¹«ÖÆ
(cond
    ((= 0 MEASUREMENT) ;
   (setq patname (getenv "ANSIHatch"))
    )
    ((= 1 MEASUREMENT)
   (setq patname (getenv "ISOHatch"))
    )
)

   (setq filename (findfile patname))
(setq filepath (strcat (VL-FILENAME-DIRECTORY filename) "\\"))
2、好像应该按照i文件支持路径顺序找acad.pat或者acadiso.pat

譬如天正,斯维尔之类的,它们的标准pat文件并不在你的那个目录下,(getpath)

3、如果是根据图案名字来定义文件名,可以不考虑添加,因为一个文件名只有一种图案有效。
4、如果是批量或者连续选择,建议前面让用户选择,是否添加到标准图案库中,如果是,则判断标准图案中是否有
有则不计算,无则计算。
如果不是添加到标准图案中,则寻找支持目录下是否有同名的图案名,有的话不计算,否则计算。
这样可以防止覆盖原来的pat

gzxl 发表于 2011-12-25 10:48:39

精彩,无私奉献

669423907 发表于 2011-12-25 10:59:44

我搞机械的,虽然用不上,但是很支持!
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 【Gu_xl】自动提取AutoCAD 图形中填充图案的定义文件