Тема: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Опции:
Quantity (Q) - количество полилиний от 2 до 16
Justification (J) - выравнивание Zero - по "нулевой" линнии (середине), Top - по верху, Bottom - по низу.
Offset (O) - расстояние между полилиниями.
Кроме того ввод на запрос начальной точки или опции букв Z, T, B - меняет выравнивание, цифр от 1 до 16 - количество полилиний, комбинаций типа 12Z, 5T, 8B - выравнивание и количесво полилиний одновременно.
Дуговые сегменты не поддерживаются.

(defun c:mpl(/ ptOpt oldQuont oldJust oldOff stPt mlName lastEnt
          firEnt lnSet oldEcho rLst *error*)
  (vl-load-com)
(defun asmi-mlStyleCreate(Quont / dxfLst topOrd Count mlDict)
  (setq dxfLst
   (list'(0 . "MLINESTYLE")'(102 . "{ACAD_REACTORS")'(102 . "}")
    '(100 . "AcDbMlineStyle")(cons 2(strcat(itoa Quont)"_PLINES"))
    '(70 . 0)'(3 . "")'(62 . 256)'(51 . 1.5708)'(52 . 1.5708)
     (cons 71 Quont))
       Count 0.0
       topOrd(-(/ Quont 2.0) 0.5)
    ); end setq
  (repeat Quont
    (setq dxfLst(append dxfLst
            (list(cons 49(- topOrd Count))
                 '(62 . 256) '(6 . "BYLAYER")))
      Count(1+ Count)
      );end setq
     ); end repeat
    (if
     (null
      (member
    (assoc 2 dxfLst)(dictsearch(namedobjdict)"ACAD_MLINESTYLE")))
    (progn
      (setq mlDict
         (cdr
           (assoc -1(dictsearch(namedobjdict)"ACAD_MLINESTYLE"))))
      (dictadd mlDict
           (cdr(assoc 2 dxfLst))(entmakex dxfLst))
      ); end progn
    ); end if
    (strcat(itoa Quont)"_PLINES")
    ); end of
  (defun asmi-LayersUnlock(/ restLst)
  (setq restLst '())
  (vlax-for lay(vla-get-Layers
         (vla-get-ActiveDocument
           (vlax-get-acad-object)))
    (setq restLst
       (append restLst
           (list
             (list
             lay
             (vla-get-Lock lay)
             ); end list
             ); end list
           ); end append
      ); end setq
    (vla-put-Lock lay :vlax-false)
    ); end vlax-for
  restLst
  ); end of asmi-LayersUnlock
  (defun asmi-LayersStateRestore
       (
    StateList
    )
  (foreach lay StateList
    (vla-put-Lock(car lay)(cadr lay))
    ); end foreach
  (princ)
  ); end of asmi-LayersStateRestore
  (defun *error*(msg)
    (if(and lastEnt(not(equal lastEnt(entlast))))
      (command "_.erase" (entlast) "")
      ); end if
    (setvar "CMDECHO" oldEcho)
    (if rLst
      (asmi-LayersStateRestore rLst)
      ); end if
    (princ msg)
    ); end of *error*
  (if(not mpl:quont)(setq mpl:quont 2))
  (if(not mpl:just)(setq mpl:just "Zero"))
  (if(not mpl:off)(setq mpl:off 40.0))
  (setq ptOpt T
    oldQuont mpl:quont
    oldJust mpl:just
    oldOff mpl:Off
    oldEcho(getvar "CMDECHO")
    ); end setq
  (while(and ptOpt(/= 'LIST (type ptOpt)))
  (princ
    (strcat "\n>>> Quantity = " (itoa mpl:quont)
        ", Justification = " mpl:just
        ", Offset = " (rtos mpl:off) " <<< "
        ); end strcat
    ); end princ
  (initget 128)
  (setq ptOpt
     (getpoint
       (strcat "\nSpecify start point or [Quantity/Justification/Offset]: ")))
    (if(=(type ptOpt) 'STR)
      (setq ptOpt(strcase ptOpt))
      ); end if
    (cond
       ((= 'LIST(type ptOpt))
       (setq stPt ptOpt)
       (princ "\nSpecify next point or [Undo]: ")
       ); end condition #1
      ((= ptOpt "Q")
       (setq mpl:quont
          (getint
        (strcat "\nSpecify quantity from 2 to 16 <"(itoa mpl:quont)">: ")))
       (if(null mpl:quont)(setq mpl:quont oldQuont))
       (if(or(< mpl:quont 2)(> mpl:quont 16))
     (progn
       (setq mpl:quont oldQuont)
       (princ "\nOnly from 2 to 16 polylines are available. ")
       ); end progn
     ); end if
       ); end condition #2
      ((= ptOpt "J")
       (initget "Zero Top Bottom")
       (setq mpl:just
          (getkword
        (strcat "\nSpecify justification [Zero/Top/Bottom] <" mpl:just ">: ")))
       (if(null mpl:just)(setq mpl:just oldJust))
       ); end condition #4
      ((= ptOpt "O")
       (initget 2)
       (setq mpl:off
          (getdist
        (strcat "\nSpecify offset distance <" (rtos mpl:off) ">: ")))
       (if(null mpl:off)(setq mpl:off oldOff))
       ); end condition #5
      ((if(member ptOpt
          '("2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16"))
       (setq mpl:quont(atoi ptOpt))
       ); end if
      ); end condition #6
      ((if(member ptOpt
         '("Z" "T" "B"))
     (setq mpl:just(cadr
               (assoc(strcase ptOpt)
               '(("Z" "Zero")("T" "Top")("B" "Bottom"))))
           ); end setq
      ); end if
     ); end condition #7
      ((if(member ptOpt
          '("2Z" "2T" "2B" "3Z" "3T" "3B" "4Z" "4T" "4B" "5Z" "5T" "5B"
            "6Z" "6T" "6B" "7Z" "7T" "7B" "8Z" "8T" "8B" "9Z" "9T" "9B"
            "10Z" "10T" "10B" "11Z" "11T" "11B" "12Z" "12T" "12B"
            "13Z" "13T" "13B" "14Z" "14T" "14B" "15Z" "15T" "15B"
            "16Z" "16T" "16B"))
       (setq mpl:quont
          (atoi(substr ptOpt 1(1-(strlen ptOpt))))
         mpl:just(cadr
               (assoc(substr(strcase ptOpt)(strlen ptOpt)1)
               '(("Z" "Zero")("T" "Top")("B" "Bottom"))))
         ); end setq
      ); end if
    ); end condition #8
      ((if ptOpt(princ "\nInvalid option keyword. "))
       ); end condition #9
      ); end cond
    ); end while
  (if ptOpt
    (progn
  (setq mlName(asmi-mlStyleCreate mpl:quont))
  (if(entlast)
  (setq lastEnt(entlast))
    ); end if
  (setvar "cmdecho" 0)
  (command "_.mline"
       "_ST" mlName
       "_S" mpl:off
       "_J" mpl:just
       stPt)
    (setvar "CMDECHO" 1)
    (while(= 1(getvar "CMDACTIVE"))
    (command pause)
    ); end while
  (setvar "CMDECHO" 0)
  (if(or(not lastEnt)(not(equal lastEnt (entlast))))
    (setq lastEnt(entlast))
    (setq lastEnt nil)
    ); end if
  (if lastEnt
    (progn
    (setq rLst(asmi-LayersUnlock))
    (command "_.explode" lastEnt)
    (setq lnSet(ssadd))
    (ssadd
      (setq lastEnt
         (entnext lastEnt))
                 lnSet); end setq
  (while
    (setq lastEnt(entnext lastEnt))
    (if lastEnt(ssadd lastEnt lnSet))
    ); end while
  (cond
    ((or
       (and lnSet(not(getvar "PEDITACCEPT")))
       (and lnSet(=(getvar "PEDITACCEPT")0))
       ); end or
    (command "_.pedit" "_m" lnSet "" "_y" "_j" "0.0" "")
     ); end condition #1
    ((and lnSet(=(getvar "PEDITACCEPT")1))
     (command "_.pedit" "_m" lnSet "" "_j" "0.0" "")
     ); end condition #2
    ); end cond
    (asmi-LayersStateRestore rLst)
    (setvar "CMDECHO" oldEcho)
    ); end progn
   ); end if
  ); end progn
 ); end if
  (princ)
  ); end of c:mpl

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Чтобы работало в русском автокаде нужно

(command "_.mline"
     "_ST" mlName
     "_S" mpl:off
     "_J" mpl:just
     stPt)

Заменить на

(command "_.mline"
     "_ST" mlName
     "_S" mpl:off
     "_J" (strcat "_" mpl:just)
     stPt)

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

> {Smirnoff}
Получил такое сообщение:

Команда: mpl
>>> Quantity = 2, Justification = Zero, Offset = 40 <<<
Specify start point or [Quantity/Justification/Offset]:
Specify next point or [Undo]:
Неправильное ключевое слово.
Функция отменена
Тип расположения [Верх/Центр/Низ] <верх>:

Что-то нарисовалось, все-таки, но это оказалась мультилиния, а не полилинии.

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Да, иизвините. В этом небольшом моменте я то про русский AutoCAD и забыл. VVA спасибо.

> Владимир Громов
Хотя ты и сам можешь поменять. Но чтобы другим не надо было по коду рыскать:

(defun c:mpl(/ ptOpt oldQuont oldJust oldOff stPt mlName lastEnt
          firEnt lnSet oldEcho rLst *error*)
  (vl-load-com)
(defun asmi-mlStyleCreate(Quont / dxfLst topOrd Count mlDict)
  (setq dxfLst
   (list'(0 . "MLINESTYLE")'(102 . "{ACAD_REACTORS")'(102 . "}")
    '(100 . "AcDbMlineStyle")(cons 2(strcat(itoa Quont)"_PLINES"))
    '(70 . 0)'(3 . "")'(62 . 256)'(51 . 1.5708)'(52 . 1.5708)
     (cons 71 Quont))
       Count 0.0
       topOrd(-(/ Quont 2.0) 0.5)
    ); end setq
  (repeat Quont
    (setq dxfLst(append dxfLst
            (list(cons 49(- topOrd Count))
                 '(62 . 256) '(6 . "BYLAYER")))
      Count(1+ Count)
      );end setq
     ); end repeat
    (if
     (null
      (member
    (assoc 2 dxfLst)(dictsearch(namedobjdict)"ACAD_MLINESTYLE")))
    (progn
      (setq mlDict
         (cdr
           (assoc -1(dictsearch(namedobjdict)"ACAD_MLINESTYLE"))))
      (dictadd mlDict
           (cdr(assoc 2 dxfLst))(entmakex dxfLst))
      ); end progn
    ); end if
    (strcat(itoa Quont)"_PLINES")
    ); end of
  (defun asmi-LayersUnlock(/ restLst)
  (setq restLst '())
  (vlax-for lay(vla-get-Layers
         (vla-get-ActiveDocument
           (vlax-get-acad-object)))
    (setq restLst
       (append restLst
           (list
             (list
             lay
             (vla-get-Lock lay)
             ); end list
             ); end list
           ); end append
      ); end setq
    (vla-put-Lock lay :vlax-false)
    ); end vlax-for
  restLst
  ); end of asmi-LayersUnlock
  (defun asmi-LayersStateRestore
       (
    StateList
    )
  (foreach lay StateList
    (vla-put-Lock(car lay)(cadr lay))
    ); end foreach
  (princ)
  ); end of asmi-LayersStateRestore
  (defun *error*(msg)
    (if(and lastEnt(not(equal lastEnt(entlast))))
      (command "_.erase" (entlast) "")
      ); end if
    (setvar "CMDECHO" oldEcho)
    (if rLst
      (asmi-LayersStateRestore rLst)
      ); end if
    (princ msg)
    ); end of *error*
  (if(not mpl:quont)(setq mpl:quont 2))
  (if(not mpl:just)(setq mpl:just "Zero"))
  (if(not mpl:off)(setq mpl:off 40.0))
  (setq ptOpt T
    oldQuont mpl:quont
    oldJust mpl:just
    oldOff mpl:Off
    oldEcho(getvar "CMDECHO")
    ); end setq
  (while(and ptOpt(/= 'LIST (type ptOpt)))
  (princ
    (strcat "\n>>> Quantity = " (itoa mpl:quont)
        ", Justification = " mpl:just
        ", Offset = " (rtos mpl:off) " <<< "
        ); end strcat
    ); end princ
  (initget 128)
  (setq ptOpt
     (getpoint
       (strcat "\nSpecify start point or [Quantity/Justification/Offset]: ")))
    (if(=(type ptOpt) 'STR)
      (setq ptOpt(strcase ptOpt))
      ); end if
    (cond
       ((= 'LIST(type ptOpt))
       (setq stPt ptOpt)
       (princ "\nSpecify next point or [Undo]: ")
       ); end condition #1
      ((= ptOpt "Q")
       (setq mpl:quont
          (getint
        (strcat "\nSpecify quantity from 2 to 16 <"(itoa mpl:quont)">: ")))
       (if(null mpl:quont)(setq mpl:quont oldQuont))
       (if(or(< mpl:quont 2)(> mpl:quont 16))
     (progn
       (setq mpl:quont oldQuont)
       (princ "\nOnly from 2 to 16 polylines are available. ")
       ); end progn
     ); end if
       ); end condition #2
      ((= ptOpt "J")
       (initget "Zero Top Bottom")
       (setq mpl:just
          (getkword
        (strcat "\nSpecify justification [Zero/Top/Bottom] <" mpl:just ">: ")))
       (if(null mpl:just)(setq mpl:just oldJust))
       ); end condition #4
      ((= ptOpt "O")
       (initget 2)
       (setq mpl:off
          (getdist
        (strcat "\nSpecify offset distance <" (rtos mpl:off) ">: ")))
       (if(null mpl:off)(setq mpl:off oldOff))
       ); end condition #5
      ((if(member ptOpt
          '("2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16"))
       (setq mpl:quont(atoi ptOpt))
       ); end if
      ); end condition #6
      ((if(member ptOpt
         '("Z" "T" "B"))
     (setq mpl:just(cadr
               (assoc(strcase ptOpt)
               '(("Z" "Zero")("T" "Top")("B" "Bottom"))))
           ); end setq
      ); end if
     ); end condition #7
      ((if(member ptOpt
          '("2Z" "2T" "2B" "3Z" "3T" "3B" "4Z" "4T" "4B" "5Z" "5T" "5B"
            "6Z" "6T" "6B" "7Z" "7T" "7B" "8Z" "8T" "8B" "9Z" "9T" "9B"
            "10Z" "10T" "10B" "11Z" "11T" "11B" "12Z" "12T" "12B"
            "13Z" "13T" "13B" "14Z" "14T" "14B" "15Z" "15T" "15B"
            "16Z" "16T" "16B"))
       (setq mpl:quont
          (atoi(substr ptOpt 1(1-(strlen ptOpt))))
         mpl:just(cadr
               (assoc(substr(strcase ptOpt)(strlen ptOpt)1)
               '(("Z" "Zero")("T" "Top")("B" "Bottom"))))
         ); end setq
      ); end if
    ); end condition #8
      ((if ptOpt(princ "\nInvalid option keyword. "))
       ); end condition #9
      ); end cond
    ); end while
  (if ptOpt
    (progn
  (setq mlName(asmi-mlStyleCreate mpl:quont))
  (if(entlast)
  (setq lastEnt(entlast))
    ); end if
  (setvar "cmdecho" 0)
  (command "_.mline"
     "_ST" mlName
     "_S" mpl:off
     "_J" (strcat "_" mpl:just)
         stPt)
    (setvar "CMDECHO" 1)
    (while(= 1(getvar "CMDACTIVE"))
    (command pause)
    ); end while
  (setvar "CMDECHO" 0)
  (if(or(not lastEnt)(not(equal lastEnt (entlast))))
    (setq lastEnt(entlast))
    (setq lastEnt nil)
    ); end if
  (if lastEnt
    (progn
    (setq rLst(asmi-LayersUnlock))
    (command "_.explode" lastEnt)
    (setq lnSet(ssadd))
    (ssadd
      (setq lastEnt
         (entnext lastEnt))
                 lnSet); end setq
  (while
    (setq lastEnt(entnext lastEnt))
    (if lastEnt(ssadd lastEnt lnSet))
    ); end while
  (cond
    ((or
       (and lnSet(not(getvar "PEDITACCEPT")))
       (and lnSet(=(getvar "PEDITACCEPT")0))
       ); end or
    (command "_.pedit" "_m" lnSet "" "_y" "_j" "0.0" "")
     ); end condition #1
    ((and lnSet(=(getvar "PEDITACCEPT")1))
     (command "_.pedit" "_m" lnSet "" "_j" "0.0" "")
     ); end condition #2
    ); end cond
    (asmi-LayersStateRestore rLst)
    (setvar "CMDECHO" oldEcho)
    ); end progn
   ); end if
  ); end progn
 ); end if
  (princ)
  ); end of c:mpl

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Теперь полилинии? :)

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Сейчас все работает, окончательно отрисовываются полилинии, спасибо. Но интересно (или, наоборот, неинтересно) - в русской версии часть запросов в командной строке идет на английском языке (программные запросы), а часть на русском (командные запросы).

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Владимир Громов пишет:

Сейчас все работает, окончательно отрисовываются полилинии, спасибо. Но интересно (или, наоборот, неинтересно) — в русской версии часть запросов в командной строке идет на английском языке (программные запросы), а часть на русском (командные запросы).

Да, так и есть, запросы типа [Close/Undo] оригинальные, т. е. работает команда _mline. Я понимаю что это не совсем удобно, но в данном случае что либо придумать сложно (я так думаю), кроме перевода интерфейса полностью на русский язык. У меня были опыты с подобной программой не использующей отрисовку мультилинии, а временных линий с помощью функции GRVECS но к сожалению в данном случае не работают привязки и при большом количестве отрезков сказывается мерцание при переодической перерисовке (есть плюс - нет ограничений по количеству). Короче не очень комфортно. А полностью перевести на русский нет проблем.
Ещё где то в домашем компе есть функция автоматического переключения клавы (LISP+VBA), для включения в состав лисп програм еcли они не на оригинальном языке. Мне нет надобности её пользоватся, всё равно всё на латинице. Но она тестирована только на одном компе, а честно говоря не будет ли плачевных результатов типа Fatal Error при обращении к функциям Windows API
GetKeyboardLayout и ActivateKeyboardLayout я не могу гарантировать.

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Если кодовая страница русская (ANSI_1251), то будет по русски, иначе в оригинале

(defun c:mpl(/ ptOpt oldQuont oldJust oldOff stPt mlName lastEnt
      firEnt lnSet oldEcho rLst *error*)
  (vl-load-com)
(defun asmi-mlStyleCreate(Quont / dxfLst topOrd Count mlDict)
  (setq dxfLst
   (list'(0 . "MLINESTYLE")'(102 . "{ACAD_REACTORS")'(102 . "}")
    '(100 . "AcDbMlineStyle")(cons 2(strcat(itoa Quont)"_PLINES"))
    '(70 . 0)'(3 . "")'(62 . 256)'(51 . 1.5708)'(52 . 1.5708)
     (cons 71 Quont))
       Count 0.0
       topOrd(-(/ Quont 2.0) 0.5)
  ); end setq
  (repeat Quont
    (setq dxfLst(append dxfLst
      (list(cons 49(- topOrd Count))
           '(62 . 256) '(6 . "BYLAYER")))
    Count(1+ Count)
    );end setq
   ); end repeat
    (if
     (null
      (member
  (assoc 2 dxfLst)(dictsearch(namedobjdict)"ACAD_MLINESTYLE")))
    (progn
      (setq mlDict
       (cdr
         (assoc -1(dictsearch(namedobjdict)"ACAD_MLINESTYLE"))))
      (dictadd mlDict
         (cdr(assoc 2 dxfLst))(entmakex dxfLst))
      ); end progn
    ); end if
    (strcat(itoa Quont)"_PLINES")
    ); end of
  (defun asmi-LayersUnlock(/ restLst)
  (setq restLst '())
  (vlax-for lay(vla-get-Layers
     (vla-get-ActiveDocument
       (vlax-get-acad-object)))
    (setq restLst
     (append restLst
       (list
         (list
         lay
         (vla-get-Lock lay)
         ); end list
         ); end list
       ); end append
    ); end setq
    (vla-put-Lock lay :vlax-false)
    ); end vlax-for
  restLst
  ); end of asmi-LayersUnlock
  (defun asmi-LayersStateRestore
       (
  StateList
  )
  (foreach lay StateList
    (vla-put-Lock(car lay)(cadr lay))
    ); end foreach
  (princ)
  ); end of asmi-LayersStateRestore
  (defun *error*(msg)
    (if(and lastEnt(not(equal lastEnt(entlast))))
      (command "_.erase" (entlast) "")
      ); end if
    (setvar "CMDECHO" oldEcho)
    (if rLst
      (asmi-LayersStateRestore rLst)
      ); end if
    (princ msg)
    ); end of *error*
  (if(not mpl:quont)(setq mpl:quont 2))
  (if(not mpl:just)(setq mpl:just "Zero"))
  (if(not mpl:off)(setq mpl:off 40.0))
  (setq ptOpt T
  oldQuont mpl:quont
  oldJust mpl:just
  oldOff mpl:Off
  oldEcho(getvar "CMDECHO")
  ); end setq
  (while(and ptOpt(/= 'LIST (type ptOpt)))
  (princ
   (if (= (getvar "SysCodePage") "ANSI_1251")
    (strcat "\n>>> Количество = " (itoa mpl:quont)
      ", Выравнивание = " (if (= (getvar "SysCodePage") "ANSI_1251")
       (cadr(assoc(strcase mpl:just) '(("ZERO" "Центр")("TOP" "Верх")("BOTTOM" "Низ"))))
       mpl:just)
      ", Расстояние = " (rtos mpl:off) " <<< "
      ); end strcat
    (strcat "\n>>> Quantity = " (itoa mpl:quont)
      ", Justification = " mpl:just
      ", Offset = " (rtos mpl:off) " <<< "
      ); end strcat
       )
    ); end princ
  (initget 128 "Количество Выравнивание Расстояние Quantity Justification Offset _Q J O Q J O")
  (setq ptOpt (getpoint
     (if (= (getvar "SysCodePage") "ANSI_1251")
     (strcat "\nУкажите начальную точку или  [Количество/Выравнивание/Расстояние]: ")
     (strcat "\nSpecify start point or [Quantity/Justification/Offset]: "))))
    (if(=(type ptOpt) 'STR) (setq ptOpt(strcase ptOpt))); end if
    (cond
       ((= 'LIST(type ptOpt))
       (setq stPt ptOpt)
       (if (= (getvar "SysCodePage") "ANSI_1251")
     (princ "\nУкажите следующую точку или [Отмени]: ")
     (princ "\nSpecify next point or [Undo]: "))
       ); end condition #1
      ((= ptOpt "Q")
       (setq mpl:quont
        (getint
       (if (= (getvar "SysCodePage") "ANSI_1251")
           (strcat "\nУкажите количество между 2 и 16 <"(itoa mpl:quont)">: ")
           (strcat "\nSpecify quantity from 2 to 16 <"(itoa mpl:quont)">: "))))
       (if(null mpl:quont)(setq mpl:quont oldQuont))
       (if(or(< mpl:quont 2)(> mpl:quont 16))
     (progn
       (setq mpl:quont oldQuont)
       (if (= (getvar "SysCodePage") "ANSI_1251")
         (princ "\nПоддерживается только от 2 до 16 полилиний. ")
         (princ "\nOnly from 2 to 16 polylines are available. ")
         )
       ); end progn
     ); end if
       ); end condition #2
      ((= ptOpt "J")
       (initget "Центр Верх Низ Zero Top Bottom _Zero Top Bottom Zero Top Bottom")
       (setq mpl:just (getkword
         (if (= (getvar "SysCodePage") "ANSI_1251")
       (strcat "\nУкажите выравнивание [Центр/Верх/Низ] <" mpl:just ">: ")
       (strcat "\nSpecify justification [Zero/Top/Bottom] <" mpl:just ">: "))))
       (if(null mpl:just)(setq mpl:just oldJust))
       ); end condition #4
      ((= ptOpt "O")(initget 2)
       (setq mpl:off (getdist
         (if (= (getvar "SysCodePage") "ANSI_1251")
       (strcat "\nУкажите расстояние <" (rtos mpl:off) ">: ")
       (strcat "\nSpecify offset distance <" (rtos mpl:off) ">: "))))
       (if(null mpl:off)(setq mpl:off oldOff))
       ); end condition #5
      ((if(member ptOpt '("2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16"))
       (setq mpl:quont(atoi ptOpt))); end if
      ); end condition #6
      ((if(member ptOpt '("Z" "T" "B" "Ц" "В" "Н"))
     (setq mpl:just(cadr (assoc(strcase ptOpt)
         '(("Z" "Zero")("T" "Top")("B" "Bottom")("Ц" "Zero")("В" "Top")("Н" "Bottom"))))); end setq
     ); end if
       ); end condition #7
      ((if(member ptOpt
      '("2Z" "2T" "2B" "3Z" "3T" "3B" "4Z" "4T" "4B" "5Z" "5T" "5B" "6Z" "6T" "6B" "7Z"
    "7T" "7B" "8Z" "8T" "8B" "9Z" "9T" "9B" "10Z" "10T" "10B" "11Z" "11T" "11B" "12Z"
    "12T" "12B" "13Z" "13T" "13B" "14Z" "14T" "14B" "15Z" "15T" "15B" "16Z" "16T" "16B"
    "2Ц" "2В" "2Н" "3Ц" "3В" "3Н" "4Ц" "4В" "4Н" "5Ц" "5В" "5Н" "6Ц" "6В" "6Н" "7Ц" "7В"
    "7Н" "8Ц" "8В" "8Н" "9Ц" "9В" "9Н" "10Ц" "10В" "10Н" "11Ц" "11В" "11Н" "12Ц" "12В" "12Н"
        "13Ц" "13В" "13Н" "14Ц" "14В" "14Н" "15Ц" "15В" "15Н" "16Ц" "16В" "16Н"))
     (setq mpl:quont (atoi(substr ptOpt 1(1-(strlen ptOpt))))
             mpl:just(cadr (assoc(substr(strcase ptOpt)(strlen ptOpt)1)
                       '(("Z" "Zero")("T" "Top")("B" "Bottom")("Ц" "Zero")("В" "Top")("Н" "Bottom"))))); end setq
     ); end if
       ); end condition #8
      ((if ptOpt
     (if (= (getvar "SysCodePage") "ANSI_1251")
     (princ "\nНеверное ключевое слово. ")
     (princ "\nInvalid option keyword. ")))
       ); end condition #9
      ); end cond
    ); end while
  (if ptOpt
    (progn
  (setq mlName(asmi-mlStyleCreate mpl:quont))
  (if(entlast)(setq lastEnt(entlast))); end if
  (setvar "cmdecho" 0)
  (command "_.mline"
     "_ST" mlName
     "_S" mpl:off
     "_J" (strcat "_" mpl:just)
         stPt)
    (setvar "CMDECHO" 1)
    (while(= 1(getvar "CMDACTIVE"))
    (command pause)
    ); end while
  (setvar "CMDECHO" 0)
  (if(or(not lastEnt)(not(equal lastEnt (entlast))))
    (setq lastEnt(entlast))
    (setq lastEnt nil)
    ); end if
  (if lastEnt
    (progn
    (setq rLst(asmi-LayersUnlock))
    (command "_.explode" lastEnt)
    (setq lnSet(ssadd))
    (ssadd
      (setq lastEnt
       (entnext lastEnt))
                 lnSet); end setq
  (while
    (setq lastEnt(entnext lastEnt))
    (if lastEnt(ssadd lastEnt lnSet))
    ); end while
  (cond
    ((or
       (and lnSet(not(getvar "PEDITACCEPT")))
       (and lnSet(=(getvar "PEDITACCEPT")0))
       ); end or
    (command "_.pedit" "_m" lnSet "" "_y" "_j" "0.0" "")
     ); end condition #1
    ((and lnSet(=(getvar "PEDITACCEPT")1))
     (command "_.pedit" "_m" lnSet "" "_j" "0.0" "")
     ); end condition #2
    ); end cond
    (asmi-LayersStateRestore rLst)
    (setvar "CMDECHO" oldEcho)
    ); end progn
   ); end if
  ); end progn
 ); end if
  (princ)
  ); end of c:mpl

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Соответственно к буковкам выравнивания  Z, T, B  добавились Ц В Н

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

> VVA
Спасибо. Избавил от бряцанья на клаве, а то я уже как раз тоже самое сделать собирался :)

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Хорошая программа но как всегда хочестся большего, например задавать радиус или фаски сопряжений, тогда расшириться область применения.
Кстати, можно ли сделать так чтобы при отрисовке сопряжений штатными командами выбор линий (как первых так и вторых) не ограничивался одной?

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Я думаю что фаски и скругления это тема для отдельной программы. Безусловно можно делать сколь угодно сложные инструменты "под себя", однако другие пользователи просто неразбраться в большом количестве опций. Вот на скорую руку програмка для _fillet нескольких полилиний на заданный радиус. Для _chamfer практически тоже самое.

(defun c:mf(/ oldRad)
  (if(not mfil:rad)(setq mfil:rad 1.0))
  (setq oldRad mfil:rad
    mfil:rad(getdist
          (strcat "\nSpecify fillet radius <"
              (rtos mfil:rad) ">: " )))
  (if(null mfil:rad)(setq mfil:rad oldRad))
  (princ "\n<<< Select polylines to fillet >>> ")
  (if
    (setq plSet
       (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (setvar "CMDECHO" 0)
      (setvar "FILLETRAD" mfil:rad)
      (command "_.undo" "_be")
      (foreach x(vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex plSet)))
    (command "_.fillet" "_p"(list x(cdr(assoc 10(entget x)))))
    ); end foreach
      (command "_.undo" "_e")
      (setvar "CMDECHO" 1)
      ); end progn
    ); end if
  (princ)
  ); end of c:mf

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

В торопях забыл переменную с набором сделать локальной.

(defun c:mf(/ oldRad plSet)
  (if(not mfil:rad)(setq mfil:rad 1.0))
  (setq oldRad mfil:rad
  mfil:rad(getdist
      (strcat "\nSpecify fillet radius <"
        (rtos mfil:rad) ">: " )))
  (if(null mfil:rad)(setq mfil:rad oldRad))
  (princ "\n<<< Select polylines to fillet >>> ")
  (if
    (setq plSet
     (ssget '((0 . "LWPOLYLINE"))))
    (progn
      (setvar "CMDECHO" 0)
      (setvar "FILLETRAD" mfil:rad)
      (command "_.undo" "_be")
      (foreach x(vl-remove-if 'listp
                     (mapcar 'cadr(ssnamex plSet)))
  (command "_.fillet" "_p"(list x(cdr(assoc 10(entget x)))))
  ); end foreach
      (command "_.undo" "_e")
      (setvar "CMDECHO" 1)
      ); end progn
    ); end if
  (princ)
  ); end of c:mf 

Re: LISP. Одновременное вычерчивание 2 - 16 полилиний. Удобно для вычерчивания кабелей.

Попробовала програмку по одновременному вычерчиванию линий. Отличная идея и прекрасно работает. Но мне для полного удовлетворения нужны дополнительные возможности. Постараюсь четко определить задачу:
1.Максимальное количество параллельных линий-4.
2.Возможность задавать раличные расстояния между ними.
3.Возможность задавать каждой из них свой linetype.
4.Возможность задавать каждой из них свою толщину полилинии (это самое главное).
Может кто-то может помочь? Может есть возможность создать дополнительную програмку которая задействовала бы эту уже имеющуюся и давала бы новые дополнительные возможности