blueshake 发表于 2022-7-6 10:32:42

@李
有两个原因。
一个是我想知道cad(或你们的cad lisp大师)是如何做到这一点的。第二个是下图。
中文单词不能设置文字和线条之间的间距。这很烦人。我读过很多帖子。和
无法想出如何改变这一点。
 

VVA 发表于 2022-7-6 10:36:25

也适用于俄语文本。

使用格式化\\pxse将搁板提升到文本上方
手动执行此操作很长一段时间,因此它们优于由多个命令编写的命令。也许这真的对中国人有用。
尝试使用MTLE、VLR\u MTLE\u ON、VLR\u MTLE\u OFF命令

;;; http://forum.dwg.ru/showthread.php?t=26548&page=3
;;; Where to change the value of the interval between lines of paragraph
;;; in the reactor at multilider?
;;; search line (mtext-paragraph "\ \ pxse" 0.86667 (entlast))
;;; it change the number of 0.86667 to the desired

(defun le-endCommand (CALL CALLBACK)
(if (= (strcase (car CALLBACK)) "MLEADER")
(mtext-paragraph "\\pxse" 0.86667 (entlast)) ;;; This changes the value of line spacing section!
)
)

(defun gc:FieldCode (ent / foo elst xdict dict field str)
;; credits gile
(defun foo (field str / pos fldID objID)
   (setq pos 0)
   (if (setq pos (vl-string-search "\\_FldIdx " str pos))
   (while (setq pos (vl-string-search "\\_FldIdx " str pos))
       (setq fldId (entget (cdr (assoc 360 field)))
             field (vl-remove (assoc 360 field) field)
             str   (strcat
                     (substr str 1 pos)
                     (if (setq objID (cdr (assoc 331 fldId)))
                     (vl-string-subst
                         (strcat "ObjId " (itoa (gc:EnameToObjectId objID)))
                         "ObjIdx"
                         (cdr (assoc 2 fldId))
                     )
                     (foo fldId (cdr (assoc 2 fldId)))
                     )
                     (substr str (1+ (vl-string-search ">%" str pos)))
                   )
       )
   )
   str
   )
)
   ;; gc:EnameToObjectId (gile)
;; Returns the ObjectID from an ename
;;
;; Argument : an ename

(defun gc:EnameToObjectId (ename)
;; credits gile
((lambda (str)
    (hex2dec
      (substr (vl-string-right-trim ">" str) (+ 3 (vl-string-search ":" str)))
    )
)
   (vl-princ-to-string ename)
)
)
   ;;============================================================;;

;; hex2dec (gile)
;; convert an hexadecimal into a decimal (int)
;;
;; Argument : un hexadedimal (string)

(defun hex2dec (s / r l n)
(setq        r 0 l (vl-string->list (strcase s)))
(while (setq n (car l))
   (setq l (cdr l)
         r (+ (* r 16) (- n (if (<= n 57) 48 55)))
   )
)
)
;;--------------------------------------------------------;;

(setq elst (entget ent))
(if (vlax-property-available-p (vlax-ename->vla-object ent) 'Textstring)
   (setq str (vla-get-TextString (vlax-ename->vla-object ent)))
   )
(if (and
(member (cdr (assoc 0 elst)) '("ATTRIB" "MTEXT" "TEXT" "MULTILEADER"))
(setq xdict (cdr (assoc 360 elst)))
(setq dict (dictsearch xdict "ACAD_FIELD"))
(setq field (dictsearch (cdr (assoc -1 dict)) "TEXT"))
   )
   (setq str (foo field (cdr (assoc 2 field))))
)
   str
)
(defun isFieldAvailable ( obj/ fc )
(if (= (type obj) 'ENAME)
   (setq obj (vlax-ename->vla-object obj))
   )
(and
   (setq fc (vla-GetExtensionDictionaryobj))
   (setq fc (vlax-vla-object->ename fc))
   (dictsearch fc "ACAD_FIELD")
   )
)
(defun mtext-paragraph ( pat value obj / ss i mtext ent)
;;; Изменить межстрочный интервал мтекста и многострочных аттрибутов
;;; Change Line Spacing
;;; http://forum.dwg.ru/showthread.php?t=54857
;;; Измените значение системной переменной ATTIPE на 1 и будет
;;; в редакторе многострочных атрибутов полноценный вариант редактора
;;; pat "\\pxse" or "\\pxsm"
;;; value - koeff like 0.86667
;;; obj - ename or vla object
(vl-load-com)
(setq value (rtos value 2 5))
(if (= (type obj) 'ENAME)(setq obj (vlax-ename->vla-object obj)))
(setq ent (vlax-vla-object->ename obj))
(if (and (vlax-write-enabled-p obj)
       (vlax-property-available-p obj 'Textstring)
                (or (not (vlax-property-available-p obj 'MTextAttribute))
                  (and (vlax-property-available-p obj 'MTextAttribute)
                         (eq (vla-get-MTextAttribute obj) :vlax-true)
                         )
                  )
                )
         (progn
         (setq mtext (gc:FieldCode ent))
         (if (not(setq i (vl-string-search "\\PX" (strcase mtext))))
             (setq i 0)
             )
         (if (wcmatch (strcase (substr mtext (1+ i) 3)) "\\PX")
             (setq mtext
               (strcat (if (not (zerop i))(substr mtext 1 i) "")
               pat value ";"
               (substr mtext (+ 2 (vl-string-search ";" mtext i))))
                   )
             (setq mtext (strcat pat value ";" mtext))
             )
         (vla-put-TextString obj mtext)
         (if (isFieldAvailable obj)
             (progn
               (vl-cmdf "_.updatefield" ent "")
               (entupd ent)
               )
             )
         )
       )
)

(defun C:MTLS ( / ss i lst mtext ls *LS*)
;;; MText Line Spacing
;;; Change line spacing mtext and multi-attribute
;;; Change Line Spacing
;;; Http://forum.dwg.ru/showthread.php?t=54857
;;; Change the value of system variable ATTIPE at 1 and will
;;, the editor of multi-attributes high-grade version of the editor(vl-load-com)
(if (zerop
   (setq
       *LS* (abs
            (atof (vl-princ-to-string (getcfg "AppData/MTEXTLS/LS")))
            ) ;_ end of abs
   ) ;_ end of setq
   ) ;_ end of zerop
(setq *LS* 1)
) ;_ end of if
(if (and
       (progn
         (initget 6)
         (princ "\nEnter line spasing value <")
         (princ *LS*)
         (princ ">: ")
         (if (setq ls (getreal))
         (progn
             (setq *LS* ls)
             (setcfg "AppData/MTEXTLS/LS" (rtos *LS* 2 2))
             )
         (setq ls *LS*)
         )
       )
       (setq lst nil ss (ssget "_:L" '((0 . "MTEXT,ATTDEF,INSERT,MULTILEADER"))))
       (repeat (setq i (sslength ss)) ;_ end setq
      (setq lst (cons (ssname ss (setq i (1- i))) lst))
      ) ;_ en
       )
   (progn
   (setq ss nil)
   (foreach itm lst
       (if (and itm (setq itm (vlax-ename->vla-object itm))
          (vlax-property-available-p itm 'Hasattributes)
   (eq :vlax-true (vla-get-HasAttributes itm))
                )
         (setq ss (append ss
                        (mapcar 'vlax-vla-object->ename
                        (append (vlax-invoke itm 'Getattributes)(vlax-invoke itm 'Getconstantattributes))
                                  )
                        )
               )
          )
       )
   (setq lst (append lst ss))
   (foreach itm lst (mtext-paragraph "\\pxsm" ls itm))
   )
   )
(princ)
)
(defun C:MTLE ( / ss i lst mtext ls *LE*)
;;; MText Line Equal
;;; Change line spacing mtext and multi-attribute
;;; Change Line Equal
;;; Http://forum.dwg.ru/showthread.php?t=54857
;;; Change the value of system variable ATTIPE at 1 and will
;;, the editor of multi-attributes high-grade version of the editor
(vl-load-com)
(if (zerop
   (setq
       *LE* (abs
            (atof (vl-princ-to-string (getcfg "AppData/MTEXTLS/LE")))
            ) ;_ end of abs
   ) ;_ end of setq
   ) ;_ end of zerop
(setq *LE* 1)
) ;_ end of if
(if (and
       (progn
         (initget 6)
         (princ "\nEnter line spasing (equal) value <")
         (princ *LE*)
         (princ ">: ")
         (if (setq ls (getreal))
         (progn
             (setq *LE* ls)
             (setcfg "AppData/MTEXTLS/LE" (rtos *LE* 2 2))
             )
         (setq ls *LE*)
         )
       )
       (setq lst nil ss (ssget "_:L" '((0 . "MTEXT,ATTDEF,INSERT,MULTILEADER"))))
       (repeat (setq i (sslength ss)) ;_ end setq
      (setq lst (cons (ssname ss (setq i (1- i))) lst))
      ) ;_ en
       )
   (progn
   (setq ss nil)
   (foreach obj lst
       (if (and obj (setq obj (vlax-ename->vla-object obj))
          (vlax-property-available-p obj 'Hasattributes)
   (eq :vlax-true (vla-get-HasAttributes obj))
                )
         (setq ss (append ss
                        (mapcar 'vlax-vla-object->ename
                        (append (vlax-invoke obj 'Getattributes)(vlax-invoke obj 'Getconstantattributes))
                                  )
                        )
               )
          )
       )
   (setq lst (append lst ss))
   (foreach itm lst (mtext-paragraph "\\pxse" ls itm))
   )
   )
(princ)
)



(defun C:VLR_MTLE_ON ()
(vl-load-com)
(or *vlr-MTLE
    (setq *vlr-MTLE (vlr-command-reactor nil '((:vlr-commandEnded . le-endCommand)))))
(princ "\nMtex Line Equal Reactor ON")
(setvar "MODEMACRO" (strcat "*LE* "(VL-STRING-LEFT-TRIM "*LE* " (getvar "MODEMACRO"))))
(princ)
)


;;Turn the reactors off
(defun C:VLR_MTLE_OFF ()
(and *vlr-MTLE (vlr-added-p *vlr-MTLE) (vlr-remove *vlr-MTLE))
(setvar "MODEMACRO" (VL-STRING-LEFT-TRIM "*LE* " (getvar "MODEMACRO")))
(princ "\nMtex Line Equal Reactor OFF")
(princ)
)
(princ "\nType MTLE, MTLS, VLR_MTLE_ON, VLR_MTLE_OFF in command line")

 
 
注:所有俄语注释均通过机器翻译。希望他们能充分翻译

blueshake 发表于 2022-7-6 10:39:19

嗨,VVA
首先感谢您的代码。
我正在使用您的代码,并发现以下问题。
我使用mtle命令并输入值“1”,它在图片中显示左侧结果。
但输入值“2”,它会在图片中显示正确的结果(这是错误的)。我错过了什么吗??有关更多详细信息,请参阅所附图片。

VVA 发表于 2022-7-6 10:41:19

需要使用0.8-0.9中的值。尝试指定值0.86。
如何找到所需的值格式化\\pxse?
1.绘制文字高度为1的多重引线
 
http://s1.ipicture.ru/uploads/20101229/NBs6asc8.jpg
 
2.使用行距格式
 
http://s2.ipicture.ru/uploads/20101229/u6Qp9m2h.jpg
 
3、求段落行距的值。会的
 
http://s2.ipicture.ru/uploads/20101229/S7RxmtHL.jpg
 
4.对于具有几行的多重引线,我使用段落间距省略2行和后续行
 
http://s2.ipicture.ru/uploads/20101229/czAMRvaa.jpg
 
对现有mleader使用MTLE命令
在绘制新的多重引线之前,键入命令VLR\u MTLE\u ON

VVA 发表于 2022-7-6 10:46:34

请求版主移动帖子,从新帖子中的11个开始

blueshake 发表于 2022-7-6 10:49:03

它起作用了。凉的谢谢

blueshake 发表于 2022-7-6 10:51:52

@VVX
 
我在代码的最后一行添加了以下代码。但cad在没有此类命令的情况下给出错误。
 
(command "VLR_MTLE_ON")

Lee Mac 发表于 2022-7-6 10:54:41

您不能这样调用LISP函数,而是:
 
(c:VLR_MTLE_ON)

blueshake 发表于 2022-7-6 11:00:59

:)酷男人。李。
页: 1 [2]
查看完整版本: 将对象设为块