Lisp将文本替换为bloc
我有一个项目,有一个要求提交。图纸和。dgn文件。该项目最初是在MicroStation中完成的。我们遇到的问题是,一些尺寸在起草时在原始MicroStation文件中被分解,因此这些尺寸只是带有单行文字“F”作为尺寸终止符的行。“F”是由于MS的标注风格。我希望有人见过某种lisp,它可以找到所有只包含字母“F”的单行文本,在上面放置一个具有相同旋转和属性的块,然后删除“F”。我可能在这方面做了一些激烈的梦,但我想我会把它扔出去。有大量文件需要修复。我已经在这个论坛上找到了很多有用的帖子。我已经找了整整两天的东西了,即使很接近,也许我可以把一些东西拼凑起来。我只是lisp的初学者,但这个网站帮助很大。谢谢 试试看。只需编辑指示的行以使用正确的块名。
这将仅应用旋转属性;如果你想要层次和东西,请告诉我。
(defun c:txttoblk( / ss)
(vl-load-com)
(setq blk "BLOCK") ; Put block name here, with directory if block is not already in drawing
(setq ss (ssget "X" '((0 . "TEXT")(1 . "F"))))
(if ss
(progn
(setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(mapcar '(lambda (x) (vl-cmdf "-insert" blk (cdr (assoc 10 (entget x))) 1 1 (* (/ 180 pi) (cdr (assoc 50 (entget x)))))
(entdel x)) ss)
)
(princ "\nNo text entities found.")
)
(princ)
)
真 的!!Freerefill,非常感谢。我真的没想到会发生什么,但这么快!我只看到了文本到文本和块到块的示例。
Lisp程序效果很好,而且方向明确。每个终止符位置都有一个块,但其中一些位置不一致。
我认为其中一些可能受到OSNAP和/或OTRACK的影响,所以我关闭了除插入之外的所有OSNAP,这对位置有很大帮助,但仍然有一些终止符没有放置在文本插入点。我注意到这几个在当前视图之外,所以我做了一个缩放范围,这似乎做到了。
有没有办法控制块相对于文本的大小?图形集包含多个图形比例,所有文件都在模型空间中完成。
再次非常感谢!! 如果文字比例和块比例彼此有任何恒定的关系,那么是的,这不仅是可能的,而且可能相当容易。唯一的问题是规模。是1:1还是别的?也就是说,如果文本高度为1,块的比例是否为1?
至于不一致,很可能是由于我的“命令行隐藏”代码。。。很抱歉。
编辑:我刚刚又测试了一次,我没有发现那些不一致的地方。。。所以我在这一点上迷失了。。。如果你愿意,我会添加一些代码来关闭OSNAP并进行最大化,这样你就不必记得自己做了,但这取决于你。 做记号
如果您正在使用_-插入,请记住在指定插入点之前使用“_non”
如果我要解决这个问题,我会从文本实体中去掉一些DXF代码并从中插入-然后轻松保留所有图层/厚度/线型等数据 好主意,李。事实上,直到我在这里看到Alan的代码,我才看到“_non”:
http://www.cadtutor.net/forum/showthread.php?p=334825#post334825
我知道可以从命令行这样修改快照,但我不知道“non”是一个选项。我会记住的。
至于剩下的,我已经和他合作过了。dgns之前,我知道有很多信息被剥离了(甚至不能使用块、标注或引线),这就是为什么我不去理会线型和图层。。但你是对的,这仍然是可行的。
Freerefill,再次感谢!我可以添加OSNAP和缩放范围的东西,我已经在这个脚本中了。我将研究文本/块大小的关系,并让你知道,这将是锦上添花!
谢谢
Freerefill,当块比例=10.66667时,关系为文字高度=1”
非常感谢。 我接受了李的建议,因为它非常巧妙,将文本DXF代码直接转换为块的DXF代码。我通常不使用entmake,因为至少对我来说,它会生成繁琐而难看的列表。。。但是,它确实有它的好处。
在这里;如果你还需要什么,请告诉我。我很确定我的量表是正确的。
(defun c:txttoblk( / ss e)
(vl-load-com)
(setq blk "BLOCK") ; Put block name here, with directory if block is not already in drawing
(setq ss (ssget "X" '((0 . "TEXT")(1 . "F"))))
(if ss
(progn
(setq ss (vl-remove-if 'listp (mapcar 'cadr (ssnamex ss))))
(mapcar '(lambda (x)
(setq e (entget x))
(entmake
(append
(list (cons 0 "INSERT") (cons 100 "AcDbEntity") (cons 100 "AcDbBlockReference")
(cons 410 (cdr (assoc 410 e)))
(cons 8 (cdr (assoc 8 e)))
(cons 2 blk)
(cons 10 (cdr (assoc 10 e)))
(cons 41 (* (/ 32.0 3) (cdr (assoc 40 e))))
(cons 42 (* (/ 32.0 3) (cdr (assoc 40 e))))
(cons 50 (cdr (assoc 50 e))))
)
)
(entdel x)) ss)
)
(princ "\nNo text entities found.")
)
(princ)
)
Freerefill,新代码运行并删除F,块不会被放置。我可能做错了什么。。。我像以前一样把街区的路径放在第3行。在运行该文件之前,我还需要对其执行其他操作吗?
页:
[1]
2