更改属性的宽度因子
大家好,这里的文字风格有点问题背景信息:
我试图解决的问题,使搜索PDF从一个简单的字体绘图。据我所知,不使用OCR是不可能的,因为OCR是不可靠的。为了解决这个问题,我正在尝试将图形中的所有文本转换为宽度因子为1的Arial,然后打印为PDF,然后撤消更改并保持字体不变(由于我无法更改标准,这里不能永久更改字体)。
到目前为止,我已经发出了一个命令,将所有文本样式转换为Arial,宽度因子为1。不幸的是,正如本文所指出的,更改文本样式宽度并不能将更改推送到所有文本。
问题是:
我试图制作一个lisp例程,强制所有文本采用其文本样式给定的宽度(或者简单地说,宽度为1,对我来说无关紧要)。我试过“REGEN”和“REGENALL”;两者都不起作用。我认为有一种方法可以使用正确的SSGET过滤器,但是SSGET的文档让我很困惑。
我附上一张图来说明我的意思。顶部文字和底部文字都使用相同的样式,但顶部文字更窄。我在它的快速属性中没有看到widthfactor;我所知道的改变它的唯一方法是改变文本样式,然后再将其更改回来。我想能够做到这一点,用一个命令使用lisp。
任何帮助都将不胜感激
图纸1.dwg 根据李的说法(这意味着它可能是对的),SSGET无法在块内搜索。不出所料,我得到了一些适用于单个文本,但不适用于块属性的东西。
然而,大量借鉴了这条线索
http://www.cadtutor.net/forum/showthread.php?39908-更改多个块属性的宽度因子
我编写了以下代码,通过进入每个块,手动将单个文本和块属性更改为宽度=1
(defun c:arial ()
(vl-load-com)
(vlax-for
str_text_style
(vla-get-textstyles (vla-get-activedocument (vlax-get-acad-object)))
(vla-SetFont str_text_style "Arial" :vlax-False :vlax-False 0 32)
(vla-put-width str_text_style 1.0)
(vla-put-height str_text_style 0.0))
(StripMtext (ssget "x") "FHQW")
(command "regen")
;;start eat program
(setq
CE (getvar "CMDECHO")
SS (ssget "X" '((0 . "INSERT")))
CN 0
)
(setvar "CMDECHO" 0)
(if SS
(repeat (setq SL (sslength SS))
(setq
SN (ssname SS CN)
NE (entnext SN)
)
(while (and
NE
(/= (setq EN (cdr (assoc 0 (setq DT (entget NE)))))
"SEQEND"
) ;_ end of /=
) ;_ end of and
(if (= EN "ATTRIB")
(progn
(setq DT (subst (cons 41 1) (assoc 41 DT) DT))
(entmod DT)
(entupd SN)
) ;_ end of progn
;;progn
) ;_ end of if
;;if
(setq NE (entnext NE))
) ;_ end of while
;;while
(setq CN (1+ CN))
;;(repeat 25 (princ "\010"))
) ;_ end of repeat
;;repeat
(princ "\nNo input")
)
(setvar "CMDECHO" CE)
;end ate program
(if (setq i -1 ss (ssget "_X" '((0 . "TEXT"))))
(while (setq ent (ssname ss (setq i (1+ i))))
(setq elst (entget ent))
(entmod (subst (cons 41 1.0) (assoc 41 elst) elst))
(entupd ent)))
(princ (strcat "Total " (itoa CN) " blocks were converted to Arial"))
(princ)
)
不幸的是,速度非常慢:/
我认为缓慢是由于(ssget“X”((0。“INSERT”))
我不确定这是将每个块(这是我想要的)制作成一组,还是将图纸上的每个对象制作成一组。我怀疑是后者,但我不知道如何修复它。 您不必(ssget“X”'((0。“INSERT”))更改块内的文本。
尝试此操作以更改普通块(非动态块):
(setq blocks (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
(vlax-for item blocks
(if (/= "*" (substr (vla-get-Name item) 1 1))
(vlax-for item1(vla-item blocks (vla-get-Name item))
(if (= "AcDbText" (vla-get-objectname item1))
(vla-put-ScaleFactor item1 1.0)
)
)
)
)
(mapcar '(lambda(x) (vla-put-ScaleFactor (vlax-ename->vla-object x) 1.0))
(vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_X" '((0 . "TEXT")))))))
(vl-cmdf "regen")
希望能有所帮助。 如果是动态块,则使用:
(foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "X" '((0 . "INSERT")(66 . 1))))))
(while (and (setq ent (entnext ent))
(/= (cdr (assoc 0 (entget ent))) "SEQEND"))
(if (= "AcDbAttribute" (vla-get-objectname (setq obj (vlax-ename->vla-object ent))))
(vla-put-ScaleFactor obj 1.0)
)
)
)
求爱看起来你的代码很好,比我之前的代码要好得多,因为我在带有宽度覆盖的块中缺少了属性文本(显然占我们标准标题块中文本的90%左右)。
谢谢您
我唯一的改变是添加
(if (/= nil (ssget "X" '((0 . "INSERT")(66 . 1)))
...your dynamic block code...
)
因为当图形中没有块时,它给出了一个错误。和mapcar命令一样,我用if语句包围了它,这样它就不会轰炸我。
现在我终于可以批量打印图纸了。shx字体进入可搜索PDF!这有多酷?! aggie_moose,
我希望你能帮助我。我也有同样的问题,当AutoCAD文件包含文本宽度因子不等于1.0或倾斜角度不等于0的SHX文本或TT文本时,尝试从AutoCAD获取可搜索的PDF文件。我想批量转换文件并将其保持在固定状态。我们使用AutoCAD 2015,文件存储在Autodesk Vault 2015中。我们想“批量”处理这些文件。我还需要进入有属性文本的块,比如我们的标题块。你能分享你能做什么工作请请。。。 使用脚本,您可以打开、修改、保存和关闭任意多个dwg。该脚本每个dwg只有一行。输入的代码是Text2-1。lsp在上面。
打开DWG1(加载“TEXT2-1”)保存关闭
打开DWG2(加载“TEXT2-1”)保存关闭
页:
[1]