chulse 发表于 2022-7-6 10:39:24

多行文字段落间距

可以通过lisp编辑多行文字的段落间距吗?我在dxf参考中找不到它(或者我错过了它-不确定到底要找什么)。。。
 
假设它可以被dxf代码访问,我假设它可以用entmod更改?
 
我问的原因是,在2011年,多行文字段落对话框juust中的功能不起作用。Autodesk告诉我:
 
 
 
谢谢

Lee Mac 发表于 2022-7-6 10:46:53

恐怕是多行文字格式代码,类似于:
 

\\pxb0.5,a0.4;

before , after

 
使用此选项将其删除

chulse 发表于 2022-7-6 10:47:46

 
谢谢李
有可能操纵它吗?这不是一个可以用entmod更改的普通DXF代码,是吗。。。?
你能给我一个如何访问它的提示吗?

Lee Mac 发表于 2022-7-6 10:53:43

格式化代码存储在多行文字字符串(DXF 1和3)中,因此需要处理这些字符串中编码的数据。

chulse 发表于 2022-7-6 10:56:09

啊,谢谢

Lee Mac 发表于 2022-7-6 11:01:44

我想我可能会接受这个挑战——这可能是解决问题的一种方法,使用正则表达式对象来执行替换。
 

(defun c:test ( / *error* ss before after )
;; © Lee Mac 2010

(defun *error* ( msg )
   (and RegEx (vlax-release-object RegEx))
   (or (wcmatch (strcase msg) "*BREAK,*CANCEL*,*EXIT*")
       (princ (strcat "\n** Error: " msg " **")))
   (princ)
)

(if (and (setq ss (ssget "_:L" '((0 . "MTEXT"))))
          (not (initget 5))
          (setq before (getdist "\n'Before' Paragraph Spacing: "))
          (not (initget 5))
          (setq after(getdist"\n'After' Paragraph Spacing: ")))
   
   (ApplyFootoSS (lambda ( x ) (LM:ReplaceParagraphFormatting x before after)) ss)
   
)
(princ)
)

(defun LM:ReplaceParagraphFormatting ( ent before after / new RegEx )

(mapcar '(lambda ( x ) (and (zerop (eval x)) (set x nil))) '(before after))

(setq new
   (if (apply 'or (list before after))
   (strcat "\\px"
       (if before (strcat "b" (vl-princ-to-string before)) "")
       (if after(strcat (if before ",a" "a") (vl-princ-to-string after)) "")
       ";"
   )
   ""
   )
)

(setq RegEx (vlax-create-object "VBScript.RegExp"))

(setq str (LM:RegExReplace RegEx new "\\\\p.*?;" (LM:GetTextString ent)))
(vlax-release-object RegEx)

(vla-put-TextString (vlax-ename->vla-object ent) str)
)

(defun LM:GetTextString ( ent / string )
;; © Lee Mac 2010
(vl-load-com)

(and (eq 'VLA-OBJECT (type ent))
      (setq ent (vlax-vla-object->ename ent)))

((lambda ( string )
      (mapcar
      (function
          (lambda ( pair )
            (if (vl-position (car pair) '(1 3))
            (setq string (strcat string (cdr pair)))
            )
          )
      )
      (entget ent)
      )
      string
    )
   ""
)
)

(defun ApplyFootoSS ( foo ss )
;; © Lee Mac 2010
(
   (lambda ( i / e )
   (while (setq e (ssname ss (setq i (1+ i)))) (foo e))
   )
   -1
)
)

(defun LM:RegExReplace ( reg new pat str )
;; © Lee Mac 2010
(mapcar
   '(lambda ( prop value ) (vlax-put-property reg prop value))
   '(pattern global ignorecase) (list pat actrue acfalse)
)
(vlax-invoke reg 'replace str new)
)

chulse 发表于 2022-7-6 11:04:10

谢谢李
但在2011年,这没有起作用——没有变化。也许是因为“已知问题”。。。?

chulse 发表于 2022-7-6 11:11:25

我正在研究vl string subst,但我不确定从实体中提取字符串的最佳方法是什么。在我的应用中,文本相当长-远远超过DXF 1的限制(我不知道如何获得它们,所有DXF 3和1,全部加在一起…)

Lee Mac 发表于 2022-7-6 11:13:00

请尝试上面更新的代码

chulse 发表于 2022-7-6 11:18:54

成功了!谢谢
 
它确实删除了大纲结构的左对齐和缩进。
页: [1] 2
查看完整版本: 多行文字段落间距