乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 442|回复: 13

dwg图型输出为lisp文件

[复制链接]

16

主题

48

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2022-6-5 12:27:00 | 显示全部楼层 |阅读模式
可以用来画符号之类东西。结合需要修改后,可以用来搞参数化绘图。
注意:生成的lisp文件代码是不含量文字样式、标注样式的,如果含有这个,需要先改进程序或修改代码文件。

v1kdpi2ifo0.gif

v1kdpi2ifo0.gif


源码如下:
  1. (defun c:tt(/ basicpoint codeorder fileheadstring filename fileobject i k kdxf listnonstringcodes memberp nonstrl notneedcodes obdxf
  2.              obename objections replacestring sdxf startEntity strdxfstringcodes strl vlaobjects)
  3.   ;;;--------------------------------------------------------------------------------  
  4.   (defun memberp ( Obj listObjects / i boolResult)
  5.     (setq boolResult "NO" )
  6.     (setq i 0)
  7.     (while (and (= boolResult "NO")
  8.              (vla-object ename) lst))
  9.     )
  10.     lst
  11.   )
  12. ;;; -------------------------------------------------------------------------
  13. ;;选择集生成无名组
  14. (defun AddUnNameGroup (ss / actDwg objGroup ss2array)
  15. (defun SS2Array (ss / c r en)
  16.   (repeat (setq c (sslength ss))
  17.     (setq en (ssname ss (setq c (1- c))))
  18.     (if  (entget en)
  19.       (setq r (cons en r))
  20.     )
  21.   )
  22.   (vlax-safearray-fill
  23.     (vlax-make-safearray
  24.       vlax-vbObject
  25.       (cons 0 (1- (length r)))
  26.     )
  27.     (mapcar 'vlax-ename->vla-object r)
  28.   )
  29. )  
  30.    (setq actDwg (vla-get-activedocument  (vlax-get-acad-object)))
  31.   (vla-AppendItems (setq objGroup (vla-add (vla-get-Groups actDwg) "*")) (SS2Array ss))
  32.   objGroup
  33.   )
  34. ;;; -------------------------------------------------------------------------
  35. ;;说明:把自指定对象开始生成的所有对象,加入到一个新的无名组
  36. (defun AddToNewGroupFrom( addNewGroupBeginEntity / groupEntities )  
  37.   (setq groupEntities (ssadd addNewGroupBeginEntity))
  38.   (while (setq addNewGroupBeginEntity (entnext addNewGroupBeginEntity ))
  39.     (setq groupEntities (ssadd addNewGroupBeginEntity groupEntities))
  40.   )        
  41.   (AddUnNameGroup groupEntities)
  42. )
  43. ;;;-----------------------------------------------------------------
  44.   (princ "\n选择需要的对象:")  
  45.   (if (setq objections (ssget '((0 . "*line,*text,arc,circle,ellipse,hatch,dimension,ray"))))
  46.     (progn
  47.       (setq basicPoint (getpoint "需要复制的对象的插入基点:"))
  48.       (setq vlaObjects (SelectSet2VlaObjects objections ))
  49.       (foreach obj vlaObjects
  50.         (vla-move obj   (vlax-3d-point basicPoint)  (vlax-3d-point '(0  0 )) )
  51.       )
  52.       
  53.       (setq fileName "d:/makeEntity.lsp")
  54.       (setq FileObject (open fileName "w"))
  55.       
  56.       (setq NotNeedCodes (list -3 -1 2 5 102 330 340 )) ;所有不需要保留的组码的第一个元素
  57.       
  58.       (setq FileHeadString "(defun NewSignOrBlock (  / startEntity ) \n")
  59.       (setq codeOrder (list "string"))
  60.       ;;coder记录按顺序输出结果时,组码第二个元素是否是字符串,用于在生成结果文件时地确定是输出strDxfStringCodes还是listNonStringCodes中的元素
  61.       
  62.       (setq i -1)
  63.       (while (setq obEname (ssname objections (setq i (1+ i))))
  64.         (setq obDxf (entget obEname))
  65.         (setq k -1)
  66.         (setq strDxfStringCodes (list "(entmake '(") )
  67.         (setq listNonStringCodes nil)
  68.         ;;组码第二个元素是字符串的和不是字符串的分开保存,字符串需要程序在保存文件中添加分号,非字符的直接用princ函数输出即可
  69.         
  70.         ;;逐个处理选择对象,生成需要输入的结果表strDxfStringCodes、listNonStringCodes,及记录结果表中的各组码类型的codeOrder
  71.         (while (setq kDxf (nth (setq k (1+ k)) obDxf))
  72.           (if  (/=  (memberp (car kDxf ) NotNeedCodes ) "YES")  
  73.             (progn                  
  74.               (setq sdxf  (cdr kDxf ))     
  75.               (if (or (numberp sdxf)
  76.                     (listp sdxf)               
  77.                   )  
  78.                 (progn
  79.                   (setq listNonStringCodes (append listNonStringCodes (list kDxf)))
  80.                   (setq codeOrder (append codeOrder (list "NotString")))
  81.                 )
  82.                
  83.                 (progn
  84.                   (setq strDxfStringCodes (append strDxfStringCodes (list (strcat "(" (rtos (car kDxf)) " . "" (cdr kDxf) "")"))))
  85.                   (setq codeOrder (append codeOrder (list "string")))
  86.                 )
  87.               )      
  88.             )
  89.             
  90.           )
  91.         )
  92.         
  93.         ;;以下输出结果文件数据
  94.         ;;生成文件部分不变内容
  95.         (if ( = i 0)
  96.           (princ FileHeadString FileObject)
  97.         )
  98.         
  99.         ;;逐个生成选择对象组码数据
  100.         (setq strL -1)
  101.         (setq NonStrL -1)
  102.         (foreach order codeOrder
  103.           (if (= order "string")
  104.             (progn
  105.               (setq strL (1+ strL))
  106.               (if ( i 1)
  107.         (princ "(AddToNewGroupFrom startEntity)\n(princ)\n)\n(NewSignOrBlock)\n" FileObject)  
  108.         (princ "(princ)\n)\n(NewSignOrBlock)\n" FileObject)  
  109.       )  
  110.       (close FileObject)
  111.       
  112.       (replaceString)
  113.     )
  114.   )
  115.   
  116.   (foreach obj vlaObjects
  117.     (vla-move obj    (vlax-3d-point '(0  0 ))  (vlax-3d-point basicPoint))
  118.   )
  119.   (princ)
  120. )



程序文件


结果测试文件

本帖以下内容被隐藏保护;需要你回复后,才能看到!

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

7

主题

15

帖子

72

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
143
发表于 2022-6-5 21:11:00 | 显示全部楼层
感谢分享 不知道是不是我姿势不对
转成的lisp 组码不对
(defun NewSignOrBlock (  / startEntity )
(entmake '((0 .  (cdr kDxf) )(100 .  (cdr kDxf) )(67 . 0)(410 .  (cdr kDxf) )(8 .  (cdr kDxf) )(100 .  (cdr kDxf) )(10 393.167 426.663 0.0)(11 706.735 -98.8315 0.0)(210 0.0 0.0 1.0)))
(setq startEntity ( entlast ) )
(entmake '((0 .  (cdr kDxf) )(100 .  (cdr kDxf) )(67 . 0)(410 .  (cdr kDxf) )(8 .  (cdr kDxf) )(100 .  (cdr kDxf) )(10 0.0 0.0 0.0)(11 393.167 426.663 0.0)(210 0.0 0.0 1.0)))
(AddToNewGroupFrom startEntity)
(princ)
)
(NewSignOrBlock)
回复

使用道具 举报

1

主题

18

帖子

6

银币

初来乍到

Rank: 1

铜币
22
发表于 2022-6-6 20:47:00 | 显示全部楼层

(setq strDxfStringCodes (append strDxfStringCodes (list (strcat "(" (rtos (car kDxf)) " . "" (cdr kDxf) "")"))))问题出现在115行这个位置,“”(cdr kdxf)“”  比如是圆,您想生成:(0 . "CIRCLE"),实际生成的是 (0 .  (cdr kDxf),不知道您是不是有其它函数,能把(cdr kDxf) 转成字符串,再加上引号
回复

使用道具 举报

1

主题

18

帖子

6

银币

初来乍到

Rank: 1

铜币
22
发表于 2022-6-7 08:23:00 | 显示全部楼层

可以了,前面我反斜杠错了一位,弄半天不行,改成这个也能用:
(setq strDxfStringCodes (append strDxfStringCodes (list (strcat "(" (rtos (car kDxf)) " . " (write-line "\"")(cdr kDxf)(write-line "\"") ")")))),感谢楼主无私奉献!
回复

使用道具 举报

33

主题

357

帖子

36

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
487
发表于 2022-6-5 21:53:00 | 显示全部楼层
这个牢固有了,搜图块打包,文字样式线型标注样式图层块名等等均识别。我的也是
回复

使用道具 举报

16

主题

48

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2022-6-6 09:15:00 | 显示全部楼层

复制网页中的源码时候,\"  只复制了 "
下载附件中的文件吧。
回复

使用道具 举报

16

主题

48

帖子

42

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
112
发表于 2022-6-6 09:17:00 | 显示全部楼层

各有各的用途。不影响。
回复

使用道具 举报

7

主题

231

帖子

20

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
250
发表于 2022-6-6 10:51:00 | 显示全部楼层
谢谢梁老师分享新品
回复

使用道具 举报

1

主题

18

帖子

6

银币

初来乍到

Rank: 1

铜币
22
发表于 2022-6-6 12:19:00 | 显示全部楼层
我这边试了,可以转lisp,但是生成的lisp转不成图形,我用的是CAD2020,是跟CAD版本有关吗?
回复

使用道具 举报

1

主题

18

帖子

6

银币

初来乍到

Rank: 1

铜币
22
发表于 2022-6-6 12:43:00 | 显示全部楼层
我的转出来也出现(cdr kDxf)
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 01:49 , Processed in 0.271189 second(s), 78 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表