1

(0 ответов, оставленных в LISP)

Здравствуйте Уважаемые программисты!

Код ниже  (lisp NanoCAD) проставляет выноску с координатами: координаты для текста выноски берутся из указанной 1ой точки в любой ПСК, полка выноски рисуется также в любой ПСК горизонтально.

Подскажите пожалуйста как исправить это код, чтобы не смещался МТекст выноски?
Пояснение некорректной работы лиспа на прикрепленной картинке.

Заранее спасибо!



(defun trap1 (errmsg)
  (setq *error* temperr)
  (setvar "clayer" clay)
  (princ)
)

(defun C:strxy ( / sztxt p1 pt1 p2 gs up_txt dn_txt)
  (command "cmdecho" 0)
  (setq clay (getvar "clayer"))
  (setq temperr *error*)
  (setq *error* trap1)

  (setq sztxt (getreal (strcat "\nВведите высоту текста <" (rtos (getvar "TEXTSIZE")) ">: ")))
  (if (null sztxt)
    (setq sztxt (getvar "TEXTSIZE"))
    (setvar "TEXTSIZE" sztxt)
  )

(defun _addleader (up-string low-string start-point end-point / lead_obj ann_obj point-list)
  (if (not low-string)
    (setq low-string "")
  )

  (setq point-list (apply 'append (list start-point end-point)))
  (setq ann_obj (vla-addmtext
         (if (and (zerop (vla-get-activespace (vla-get-activedocument (vlax-get-acad-object))))
           (= :vlax-false (vla-get-mspace (vla-get-activedocument (vlax-get-acad-object))))
             )
             (vla-get-paperspace (vla-get-activedocument (vlax-get-acad-object)))
             (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object)))
         )
         (vlax-3d-point end-point)
         0
         (if (/= low-string "")
           (strcat up-string "\\P" low-string)
           up-string
         )
        )
  )

  (if (vlax-property-available-p ann_obj 'BackgroundFill)
    (vla-put-BackgroundFill ann_obj :vlax-true)
  )

  (setq lead_obj (vla-addleader
        (if (and (zerop (vla-get-activespace (vla-get-activedocument (vlax-get-acad-object))))
           (= :vlax-false (vla-get-mspace (vla-get-activedocument (vlax-get-acad-object)))))
    (vla-get-paperspace (vla-get-activedocument (vlax-get-acad-object)))
    (vla-get-modelspace (vla-get-activedocument (vlax-get-acad-object))))
        (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbdouble
             (cons 0 (1- (length point-list)))) point-list)) ann_obj  acLineNoArrow)
   )

  (vla-GetBoundingBox ann_obj 'minp 'maxp)
  (setq dx (- (car (vlax-safearray->list maxp))
              (car (vlax-safearray->list minp))
           )
  )

  (cond
    ((> (car end-point) (car start-point))
     (vla-put-attachmentpoint
       ann_obj
       acAttachmentPointMiddleLeft
     )
     (vla-put-insertionpoint ann_obj (vlax-3d-point end-point))
    )
    (T
     (vla-put-attachmentpoint
       ann_obj
       acAttachmentPointMiddleLeft
     )
     (setq new_pt (append (list (- (car end-point) dx)) (cdr end-point)))
     (vla-put-insertionpoint ann_obj (vlax-3d-point new_pt))
    )
  )

  (vla-put-verticaltextposition lead_obj acOutside)
  (vla-put-coordinate lead_obj 1 (vlax-3d-point end-point))
  lead_obj
)

  (vl-load-com)
  (princ "\nLUPREC value = ")
  (princ (getvar "LUPREC"))
  (princ "  TEXTSIZE value = ")
  (princ (getvar "TEXTSIZE"))

  (progn
    (setq p1 (getpoint "\nУкажите точку для считывания координат: "))
    (setq pt1 p1)
    (setq p2 (getpoint pt1 "\nУкажите размещение полки с текстом: "))

    (setq gs 100 ;шаг сетки
          up_txt (gstr p1 gs 'y)
          dn_txt (gstr p1 gs 'x))

    (_addleader
      (strcat up_txt)
      (strcat dn_txt)
      (trans pt1 1 0)
      (trans p2 1 0))
  )

  (setq ssldr (entlast))
  (vla-put-scalefactor
    (vlax-ename->vla-object ssldr)
    (* 0.2 (getvar "TEXTSIZE"))
  )

((lambda ( / rot vla_lead l_pt vla_anno)
    (setq
        rot (atan (/ (cadr (getvar "UCSXDIR")) (car (getvar "UCSXDIR"))))
        vla_lead (vlax-ename->vla-object (entlast))
        l_pt (vlax-get vla_lead 'Coordinates)
        vla_anno (vlax-get vla_lead 'Annotation)
    )

    (mapcar
        '(lambda (x)
            (vlax-invoke x 'Rotate (list (car l_pt) (cadr l_pt) (caddr l_pt)) rot)
        )
        (list vla_lead vla_anno)
    )
))

  (command "_explode" ssldr)
  (princ)
)

;Функция вычисления координат вида: "0A+50"
(defun gstr (p1 gs xw / getel tpart bstep btail stxt)
    (if (= xw 'x) (setq getel 'car tpart "Б+") (setq getel 'cadr tpart "А+"))
      (setq bstep (fix (/ ((eval getel) p1) gs)))
    (setq btail (- ((eval getel) p1) (* bstep gs)))
    (setq stxt (strcat (itoa bstep) tpart (vl-string-translate "." "," (rtos btail 2))))
    (princ stxt)
)

Здравствуйте Уважаемые программисты!

Подскажите пожалуйста, как кодом (lisp autocad) считать список из файла txt в переменную setq в виде строки элементов разделенных с помощью ";"?
Пример txt (во вложении), в setq должно получиться:

C:\Share;C:\Temp;C:\Users\user\AppData\Roaming\Autodesk\AutoCAD 2020\R23.1\rus\Support\ToolPalette

Заранее спасибо!

Здравствуйте Уважаемые программисты!

Ниже код (Lisp AutoCAD) должен в файл "Paths.txt" вставить значение из переменной "exPath".
Подскажите пожалуйста, как исправить код ниже, чтобы выполнялись два условия:
1) если файл "Paths.txt" пуст (ничего нет, даже если только пробелы), то просто записать значение "exPath" (например, C:\Users\user1\AppData\Roaming\Autodesk\AutoCAD 2020\R23.1\rus\Support\ToolPalette;C:\ToolPalettes\cad1;C:\моя папка с палитрами)
2) если файл "Paths.txt" НЕ пуст и в нем есть уже строка (например, C:\Users\user1\AppData\Roaming\Autodesk\AutoCAD 2020\R23.1\rus\Support\ToolPalette;C:\ToolPalettes\cad1), то найти последний символ (не пробелы), после этого символа сразу записать знак ";" (без кавычек) и далее вставить значение из "exPath".
Заранее спасибо!

  (if (null (vl-file-directory-p "C:\\MyFolder"))
    (vl-mkdir "C:\\MyFolder")
  )

  (setq exPath (vla-get-toolPalettePath (vla-get-files (vla-get-preferences (vlax-get-acad-object)))))
  
(if (setq file (open "C:\\MyFolder\\Paths.txt" "a"))
   (progn
       (write-line exPath file)
       (close file)
   )
   (princ "\nНе удалось создать/изменить файл Paths.txt.")
)

Здравствуйте Уважаемые специалисты по AutoCAD!
Подскажите пожалуйста как можно исправить следующее поведение Автокада версий 2007 и 2008: в чертеже есть 3 объекта, которые расположены в следующем порядке - снизу заливка, затем сверху многострочный текст со скрытием заднего плана, и еще выше текста отрезок (пример на рисунке). Проблема в следующем: по завершении редактирования, например, МТекста, сбивается порядок отображения объектов. Восстановить порядок объектов можно только командой регенерации и так каждый раз при редактировании. Причем в Автокад 2005, 2013 и выше такой проблемы нет.
Спасибо!
http://forum.dwg.ru/attachment.php?attachmentid=177779&amp;d=1476722496

Здравствуйте уважаемые специалисты!
Подскажите пожалуйста по Civilу, как на продольном профиле трассы в подпрофильной таблице в строке "Длина, уклон" сделать чтобы при нулевом уклоне рисовалась для отрезков горизонтальная линия, а не вниз или вверх как в Civil по умолчанию для стиля "Автомобильные дороги форма 5"? Заранее спасибо.