乐筑天下

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

[编程交流] 更改属性的宽度因子

[复制链接]

4

主题

15

帖子

11

银币

初来乍到

Rank: 1

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

使用道具 举报

4

主题

15

帖子

11

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 17:35:38 | 显示全部楼层
根据李的说法(这意味着它可能是对的),SSGET无法在块内搜索。不出所料,我得到了一些适用于单个文本,但不适用于块属性的东西。
 
 
 
 
然而,大量借鉴了这条线索
http://www.cadtutor.net/forum/showthread.php?39908-更改多个块属性的宽度因子
 
 
我编写了以下代码,通过进入每个块,手动将单个文本和块属性更改为宽度=1
 
 
  1. (defun c:arial ()
  2. (vl-load-com)
  3. (vlax-for
  4. str_text_style
  5. (vla-get-textstyles (vla-get-activedocument (vlax-get-acad-object)))
  6. (vla-SetFont str_text_style "Arial" :vlax-False :vlax-False 0 32)
  7. (vla-put-width str_text_style 1.0)
  8. (vla-put-height str_text_style 0.0))
  9. (StripMtext (ssget "x") "FHQW")
  10. (command "regen")
  11.      
  12. ;;start eat program
  13. (setq
  14.   CE (getvar "CMDECHO")
  15.   SS (ssget "X" '((0 . "INSERT")))
  16.   CN 0
  17. )
  18. (setvar "CMDECHO" 0)
  19. (if SS
  20.   (repeat (setq SL (sslength SS))
  21.      (setq
  22.         SN (ssname SS CN)
  23.         NE (entnext SN)
  24.      )
  25.      (while (and
  26.         NE
  27.         (/= (setq EN (cdr (assoc 0 (setq DT (entget NE)))))
  28.            "SEQEND"
  29.         ) ;_ end of /=
  30.         ) ;_ end of and
  31.         (if (= EN "ATTRIB")
  32.            (progn
  33.               (setq DT (subst (cons 41 1) (assoc 41 DT) DT))
  34.               (entmod DT)
  35.               (entupd SN)
  36.            ) ;_ end of progn
  37.         ;;progn
  38.         ) ;_ end of if
  39.         ;;if
  40.         (setq NE (entnext NE))
  41.      ) ;_ end of while
  42.      ;;while
  43.      (setq CN (1+ CN))
  44.      ;;(repeat 25 (princ "\010"))
  45.      
  46.   ) ;_ end of repeat
  47.       ;;repeat
  48.       (princ "\nNo input")
  49. )
  50. (setvar "CMDECHO" CE)
  51. ;end ate program
  52. (if (setq i -1 ss (ssget "_X" '((0 . "TEXT"))))
  53. (while (setq ent (ssname ss (setq i (1+ i))))
  54.    (setq elst (entget ent))
  55.    (entmod (subst (cons 41 1.0) (assoc 41 elst) elst))
  56.    (entupd ent)))
  57.    
  58. (princ (strcat "Total " (itoa CN) " blocks were converted to Arial"))
  59. (princ)
  60. )

不幸的是,速度非常慢:/
 
 
我认为缓慢是由于(ssget“X”((0。“INSERT”))
 
 
我不确定这是将每个块(这是我想要的)制作成一组,还是将图纸上的每个对象制作成一组。我怀疑是后者,但我不知道如何修复它。
回复

使用道具 举报

7o7

0

主题

93

帖子

93

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 17:46:23 | 显示全部楼层
您不必(ssget“X”'((0。“INSERT”))更改块内的文本。
尝试此操作以更改普通块(非动态块):
  1. (setq blocks (vla-get-blocks (vla-get-ActiveDocument (vlax-get-acad-object))))
  2. (vlax-for item blocks
  3.    (if (/= "*" (substr (vla-get-Name item) 1 1))
  4.      (vlax-for item1  (vla-item blocks (vla-get-Name item))
  5.        (if (= "AcDbText" (vla-get-objectname item1))         
  6.     (vla-put-ScaleFactor item1 1.0)
  7.        )
  8.      )
  9.   )
  10. )
  11. (mapcar '(lambda(x) (vla-put-ScaleFactor (vlax-ename->vla-object x) 1.0))
  12. (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "_X" '((0 . "TEXT")))))))  
  13. (vl-cmdf "regen")

希望能有所帮助。
回复

使用道具 举报

7o7

0

主题

93

帖子

93

银币

初来乍到

Rank: 1

铜币
0
发表于 2022-7-5 17:56:29 | 显示全部楼层
如果是动态块,则使用:
  1. (foreach ent (vl-remove-if 'listp (mapcar 'cadr (ssnamex (ssget "X" '((0 . "INSERT")(66 . 1))))))
  2. (while (and (setq ent (entnext ent))
  3.       (/= (cdr (assoc 0 (entget ent))) "SEQEND"))
  4.     (if (= "AcDbAttribute" (vla-get-objectname (setq obj (vlax-ename->vla-object ent))))
  5.   (vla-put-ScaleFactor obj 1.0)
  6.        )
  7.      )
  8. )
回复

使用道具 举报

4

主题

15

帖子

11

银币

初来乍到

Rank: 1

铜币
20
发表于 2022-7-5 18:10:09 | 显示全部楼层
求爱看起来你的代码很好,比我之前的代码要好得多,因为我在带有宽度覆盖的块中缺少了属性文本(显然占我们标准标题块中文本的90%左右)。
 
 
谢谢您
 
 
我唯一的改变是添加
 
 
  1. (if (/= nil (ssget "X" '((0 . "INSERT")(66 . 1)))
  2. ...your dynamic block code...
  3. )

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

使用道具 举报

2

主题

9

帖子

7

银币

初来乍到

Rank: 1

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

使用道具 举报

106

主题

1万

帖子

101

银币

顶梁支柱

Rank: 50Rank: 50

铜币
1299
发表于 2022-7-5 18:33:35 | 显示全部楼层
使用脚本,您可以打开、修改、保存和关闭任意多个dwg。该脚本每个dwg只有一行。输入的代码是Text2-1。lsp在上面。
 
打开DWG1(加载“TEXT2-1”)保存关闭
打开DWG2(加载“TEXT2-1”)保存关闭
回复

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

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

GMT+8, 2025-3-13 03:55 , Processed in 0.386275 second(s), 66 queries .

© 2020-2025 乐筑天下

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