aggie_moose 发表于 2022-7-5 17:25:31

更改属性的宽度因子

大家好,这里的文字风格有点问题
 
 
背景信息:
 
我试图解决的问题,使搜索PDF从一个简单的字体绘图。据我所知,不使用OCR是不可能的,因为OCR是不可靠的。为了解决这个问题,我正在尝试将图形中的所有文本转换为宽度因子为1的Arial,然后打印为PDF,然后撤消更改并保持字体不变(由于我无法更改标准,这里不能永久更改字体)。
 
 
到目前为止,我已经发出了一个命令,将所有文本样式转换为Arial,宽度因子为1。不幸的是,正如本文所指出的,更改文本样式宽度并不能将更改推送到所有文本。
 
 
 
 
问题是:
 
我试图制作一个lisp例程,强制所有文本采用其文本样式给定的宽度(或者简单地说,宽度为1,对我来说无关紧要)。我试过“REGEN”和“REGENALL”;两者都不起作用。我认为有一种方法可以使用正确的SSGET过滤器,但是SSGET的文档让我很困惑。
 
 
我附上一张图来说明我的意思。顶部文字和底部文字都使用相同的样式,但顶部文字更窄。我在它的快速属性中没有看到widthfactor;我所知道的改变它的唯一方法是改变文本样式,然后再将其更改回来。我想能够做到这一点,用一个命令使用lisp。
 
任何帮助都将不胜感激
图纸1.dwg

aggie_moose 发表于 2022-7-5 17:35:38

根据李的说法(这意味着它可能是对的),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”))
 
 
我不确定这是将每个块(这是我想要的)制作成一组,还是将图纸上的每个对象制作成一组。我怀疑是后者,但我不知道如何修复它。

7o7 发表于 2022-7-5 17:46:23

您不必(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")

希望能有所帮助。

7o7 发表于 2022-7-5 17:56:29

如果是动态块,则使用:

(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)
       )
   )
)

aggie_moose 发表于 2022-7-5 18:10:09

求爱看起来你的代码很好,比我之前的代码要好得多,因为我在带有宽度覆盖的块中缺少了属性文本(显然占我们标准标题块中文本的90%左右)。
 
 
谢谢您
 
 
我唯一的改变是添加
 
 

(if (/= nil (ssget "X" '((0 . "INSERT")(66 . 1)))


...your dynamic block code...


)

因为当图形中没有块时,它给出了一个错误。和mapcar命令一样,我用if语句包围了它,这样它就不会轰炸我。
 
 
现在我终于可以批量打印图纸了。shx字体进入可搜索PDF!这有多酷?!

THansen 发表于 2022-7-5 18:23:54

aggie_moose,
 
我希望你能帮助我。我也有同样的问题,当AutoCAD文件包含文本宽度因子不等于1.0或倾斜角度不等于0的SHX文本或TT文本时,尝试从AutoCAD获取可搜索的PDF文件。我想批量转换文件并将其保持在固定状态。我们使用AutoCAD 2015,文件存储在Autodesk Vault 2015中。我们想“批量”处理这些文件。我还需要进入有属性文本的块,比如我们的标题块。你能分享你能做什么工作请请。。。

BIGAL 发表于 2022-7-5 18:33:35

使用脚本,您可以打开、修改、保存和关闭任意多个dwg。该脚本每个dwg只有一行。输入的代码是Text2-1。lsp在上面。
 
打开DWG1(加载“TEXT2-1”)保存关闭
打开DWG2(加载“TEXT2-1”)保存关闭
页: [1]
查看完整版本: 更改属性的宽度因子