Тема: Простановка координат

Проблема такова: Как проставить координаты точки на чертеже, чтобы на выноске присутствовали X Y Z координаты? У меня с помощью соответсвующей кнопки на панели Dimension выводится либо X, либо Y. А вот как все вместе???
Заранее спасибо всем

Re: Простановка координат

Напиши маленький ЛИСПик и повесь на собственную кнопку. Проведение выноски и всякие анализы не рассматриваю

(setq Htx 2.5
      po1 (getpoint "\n Укажите точку --->")
      po2 (getpoint po1 "\n Укажите место выноски --->")
)
(command "_.TEXT"
     po2
     Htx
     0
     (strcat "X="
         (rtos (car po1) 2 2)
         "; X="
         (rtos (cadr po1) 2 2)
         "; Z="
         (rtos (caddr po1) 2 2)
     )
"")

Re: Простановка координат

Спасибо огромное!!! Надо учить LISP :))

Re: Простановка координат

Кто не знает AutoLisp'а, тот не знает AutoCAD'а.

Re: Простановка координат

а я и не знаю!!! Но надо знать :))

Re: Простановка координат

Конечно, надо знать, иначе даже вышеприведенный фрагмент не запустишь, он без начала и без конца. Только иллюстрация, и то не самая лучшая. Наверное, Alan поленился. Я тоже ленивый, мне подобные задачки давно осточертели.

Re: Простановка координат

(defun c:ptl(/ pt text)
  (if
    (setq pt(getpoint))
    (progn
      (setq text(strcat(rtos(car pt)2)","
               (rtos(cadr pt)2)","
               (rtos(nth 2 pt)2))); end setq
      (command "_.dimordinate" pt "_t" text pause)
      ); end progn
    ); end if
  (princ)
  ); end of c:ptl

Re: Простановка координат

Так с точки зрения программирования будет корректнее:

(defun c:xyz(/ pt text oldEcho *error*)
  (defun *error*(msg)
    (setvar "CMDECHO" oldEcho)
    (princ)
    ); end error
  (if
    (setq pt(getpoint "\nSpecify feature location: "))
    (progn
      (setq text(strcat(rtos(car pt)2)","
           (rtos(cadr pt)2)","
           (rtos(nth 2 pt)2))
        oldEcho(getvar "CMDECHO")); end setq
      (setvar "CMDECHO" 0)
      (command "_.dimordinate" pt "_t" text pause)
      ); end progn
    ); end if
  (setvar "CMDECHO" oldEcho)
  (princ)
  ); end of c:xyz

Re: Простановка координат

Тьфу ты, когда здесь посты можно будет править?

(defun c:xyz(/ pt text oldEcho *error*)
  (defun *error*(msg)
    (setvar "CMDECHO" oldEcho)
    (princ)
    ); end error
  (if
    (setq pt(getpoint "\nSpecify feature location: "))
    (progn
      (setq text(strcat(rtos(car pt)2)","
           (rtos(cadr pt)2)","
           (rtos(nth 2 pt)2))
      oldEcho(getvar "CMDECHO")); end setq
      (setvar "CMDECHO" 0)
      (command "_.dimordinate" pt "_t" text pause)
      (setvar "CMDECHO" oldEcho)
      ); end progn
    ); end if
  (princ)
  ); end of c:xyz

Re: Простановка координат

> Profan
не, ну кое-что то поправить могу:)> Fantomas (2005-04-04 21:02:15)

> Fantomas
спасибо, поглядим...
а где найти классный учебник по Lisp????

Re: Простановка координат

Dima пишет:

а где найти классный учебник по Lisp????

"VisulLISP и секреты адаптации AutoCAD" Н. Н. Полещук + www.afralisp.com + www.google.com + этот форум.

Re: Простановка координат

Доброго времени суток Вам!
Совсем не умею программировать, к сожалению.
Можно ли чтобы значения координат проставлялись немного по другому:
N=Y  - значение координаты Y
-- - линия выноски
E=X  - значение координаты X,
т.е все будет выглядеть примерно так:
N=100,00
------------- линия выноски
E=100,00

Re: Простановка координат

> Владислав
ToolPac->Draw->Label->Coordinates
Необходимо установить ToolPac.

Re: Простановка координат

> Игорь Богаченко
Toolpac игнорирует официальные локализции продуктов Autodesk, насколько мне известно.

Re: Простановка координат

;|Принцип работы
1. Высота текста - из текущего размерного стиля (DIMTXT)
2. Стрелки нет
3. Координаты берутся из МСК
4. Точность округления настраивается системной переменной LUPREC
   команда _UNITS
   |;
(defun C:NE ( / p1 p2)
;;На основе _kpblc-draw-leader
(defun _addleader (up-string low-string   start-point end-point /   lead_obj ann_obj point-list)
  ;; Прежде всего преобразовываем low-string в строковый вид:
  (if (not low-string)(setq low-string "")) ;_ end of if
  (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         ; устанавливается ширина именно 0, для нормального получения полки
         (if (/= low-string "")(strcat up-string "\\P" low-string) up-string))
   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) ;_ end of vla-AddLeader
   ) ;_ end of setq
  ;; Меняем настройки будущей аннотации:
 ; (vla-put-height ann_obj (* 1 (getvar "dimscale")))
  (vla-put-attachmentpoint ann_obj
    ;; Назначая точку выравнивания, будем использовать числовые значения:
    ;; acAttachmentPointBottomLeft   ->   7
    ;; acAttachmentPointBottomRight   ->   9
    ;; acAttachmentPointMiddleLeft   ->   4
    ;; acAttachmentPointMiddleRight   ->   6
    (+ 4 (if (> (car end-point) (car start-point)) ; выноска вправо, точка - влево
         0  2) ;_ end of if
       (if (/= low-string "")      ; нижняя строка есть, выр. - по  центру
           0 3) ;_ end of if
       ) ;_ end of +
    ) ;_ end of vla-put-AttachmentPoint
  (vla-put-insertionpoint ann_obj (vlax-3d-point end-point))
  ;; Теперь модицифируем собственно выноску
  (vla-put-verticaltextposition lead_obj acOutside)
  (vla-put-ArrowheadSize lead_obj 0.5)
  ;; В принципе, строка ниже не требуется - так, для страховки.
  (vla-put-coordinate lead_obj 1 (vlax-3d-point end-point)) lead_obj)
  (vl-load-com)
  (initget 1)
  (setq p1 (getpoint "\nТочка: "))
  (initget 1)
  (setq p2 (getpoint p1 "\nНаправление выноски: "))
  (setq p1 (trans p1 1 0)
    p2 (trans p2 1 0))
  (_addleader
    (strcat "N=" (rtos (nth 1 p1) 2))
    (strcat "E=" (rtos (nth 0 p1) 2))
    p1 p2)(princ))
(princ "\nНаберите в командной строке NE")

Там в принципе все есть в комантариях, но обращу еще раз внимание
1. Высота текста - из текущего размерного стиля ( DIMTXT )
2. Стрелки нет
3. Координаты берутся из МСК
4. Точность округления настраивается системной переменной LUPREC
   команда _UNITS

Re: Простановка координат

> Владислав
Вы не сказали номер версии Автокада и цель прпостановки координат. Но в 2006 я использую динамический блок и таким образом проставляю на чертеже необходимые мне координаты. У меня правда Х У, но проблема не большая в блоке заменить Х У на нужные обозначения.

Re: Простановка координат

Огромное человеческое спасибо, VVA!
Это именно то что мне и было нужно!

Re: Простановка координат

Небольшая проблема - команда берет координаты ТОЛЬКО!!! из МСК. А из пользовательских (перемещенных и развернутых) можно как-нибудь?

Re: Простановка координат

> Владислав
см. п.3 > VVA (2006-11-17 11:43:00)

;|Принцип работы
1. Высота текста — из текущего размерного стиля (DIMTXT)
2. Стрелки нет
3. Координаты берутся из ПСК
4. Точность округления настраивается системной переменной LUPREC
   команда _UNITS |;
(defun C:NE ( / p1 p2)
;;На основе _kpblc-draw-leader
(defun _addleader (up-string low-string   start-point end-point /   lead_obj ann_obj point-list)
  ;; Прежде всего преобразовываем low-string в строковый вид:
  (if (not low-string)(setq low-string "")) ;_ end of if
  (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         ; устанавливается ширина именно 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) ;_ end of vla-AddLeader
   ) ;_ end of setq
  ;; Меняем настройки будущей аннотации:
 ; (vla-put-height ann_obj (* 1 (getvar "dimscale")))
  (vla-put-attachmentpoint ann_obj
    ;; Назначая точку выравнивания, будем использовать числовые значения:
    ;; acAttachmentPointBottomLeft   ->   7
    ;; acAttachmentPointBottomRight   ->   9
    ;; acAttachmentPointMiddleLeft   ->   4
    ;; acAttachmentPointMiddleRight   ->   6
    (+ 4 (if (> (car end-point) (car start-point)) ; выноска вправо, точка — влево
       0  2) ;_ end of if
       (if (/= low-string "")      ; нижняя строка есть, выр. — по  центру
           0 3) ;_ end of if
       ) ;_ end of +
    ) ;_ end of vla-put-AttachmentPoint
  (vla-put-insertionpoint ann_obj (vlax-3d-point end-point))
  ;; Теперь модицифируем собственно выноску
  (vla-put-verticaltextposition lead_obj acOutside)
  (vla-put-ArrowheadSize lead_obj 0.5)
  ;; В принципе, строка ниже не требуется — так, для страховки.
  (vla-put-coordinate lead_obj 1 (vlax-3d-point end-point)) lead_obj)
  (vl-load-com)
  (initget 1)
  (setq p1 (getpoint "\nТочка: "))
  (initget 1)
  (setq p2 (getpoint p1 "\nНаправление выноски: "))
;;;  (setq p1 (trans p1 1 0)           ;<- Здесь переводим p1 в МСК
;;;  p2 (trans p2 1 0))                ;<- Здесь переводим p2 в МСК
  (_addleader
    (strcat "N=" (rtos (nth 1 p1) 2))
    (strcat "E=" (rtos (nth 0 p1) 2))
    (trans p1 1 0)(trans p2 1 0))(princ))
(princ "\nНаберите в командной строке NE")

Re: Простановка координат

> VVA
Думаю, это - окончательный вариант того что было мне нужно. Большое спасибо!!!

Re: Простановка координат

> Valery Brelovsky
У меня тоже ACad 2006. Можете меня научить ставить координаты так как Вы это делаете динамическим блоком?
Оговорюсь сразу - я полный чайник!

Re: Простановка координат

> Laidi
Один из вариантов лежит здесь http://dwg.ru/dnl/262

Re: Простановка координат

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

Re: Простановка координат

> Константин
Ты не уточнил, какой вариант используешь, поэтому привожу оба

;|Принцип работы
1. Высота текста — из текущего размерного стиля (DIMTXT)
2. Стрелки нет
3. Координаты берутся из МСК
4. Точность округления настраивается системной переменной LUPREC
   команда _UNITS
   |;
(defun C:NE ( / p1 p2)
;;На основе _kpblc-draw-leader
(defun _addleader (up-string low-string   start-point end-point /   lead_obj ann_obj point-list)
  ;; Прежде всего преобразовываем low-string в строковый вид:
  (if (not low-string)(setq low-string "")) ;_ end of if
  (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         ; устанавливается ширина именно 0, для нормального получения полки
         (if (/= low-string "")(strcat up-string "\\P" low-string) up-string))
   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) ;_ end of vla-AddLeader
   ) ;_ end of setq
  (vla-put-Rotation ann_obj (angle '(0 0 0)(getvar "UCSXDIR")))
  ;; Меняем настройки будущей аннотации:
 ; (vla-put-height ann_obj (* 1 (getvar "dimscale")))
  (vla-put-attachmentpoint ann_obj
    ;; Назначая точку выравнивания, будем использовать числовые значения:
    ;; acAttachmentPointBottomLeft   ->   7
    ;; acAttachmentPointBottomRight   ->   9
    ;; acAttachmentPointMiddleLeft   ->   4
    ;; acAttachmentPointMiddleRight   ->   6
    (+ 4 (if (> (car end-point) (car start-point)) ; выноска вправо, точка — влево
       0  2) ;_ end of if
       (if (/= low-string "")      ; нижняя строка есть, выр. — по  центру
           0 3) ;_ end of if
       ) ;_ end of +
    ) ;_ end of vla-put-AttachmentPoint
  (vla-put-insertionpoint ann_obj (vlax-3d-point end-point))
  ;; Теперь модицифируем собственно выноску
  (vla-put-verticaltextposition lead_obj acOutside)
  (vla-put-ArrowheadSize lead_obj 0.5)
  ;; В принципе, строка ниже не требуется — так, для страховки.
  (vla-put-coordinate lead_obj 1 (vlax-3d-point end-point)) lead_obj)
  (vl-load-com)
  (initget 1)
  (setq p1 (getpoint "\nТочка: "))
  (initget 1)
  (setq p2 (getpoint p1 "\nНаправление выноски: "))
  (setq p1 (trans p1 1 0)
  p2 (trans p2 1 0))
  (_addleader
    (strcat "N=" (rtos (nth 1 p1) 2))
    (strcat "E=" (rtos (nth 0 p1) 2))
    p1 p2)(princ))
(princ "\nНаберите в командной строке NE")

Там в принципе все есть в комментариях, но еще раз обращаю внимание
1. Высота текста — из текущего размерного стиля ( DIMTXT )
2. Стрелки нет
3. Координаты берутся из МСК
4. Точность округления настраивается системной переменной LUPREC команда _UNITS

Re: Простановка координат

И второй. Отличие в том, что координаты берутся из ПСК

;|Принцип работы
1. Высота текста — из текущего размерного стиля (DIMTXT)
2. Стрелки нет
3. Координаты берутся из ПСК
4. Точность округления настраивается системной переменной LUPREC
   команда _UNITS |;
(defun C:NE ( / p1 p2)
;;На основе _kpblc-draw-leader
(defun _addleader (up-string low-string   start-point end-point /   lead_obj ann_obj point-list)
  ;; Прежде всего преобразовываем low-string в строковый вид:
  (if (not low-string)(setq low-string "")) ;_ end of if
  (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         ; устанавливается ширина именно 0, для нормального получения полки
         (if (/= low-string "")(strcat up-string "\\P" low-string) up-string)))
  (vla-put-Rotation ann_obj (angle '(0 0 0)(getvar "UCSXDIR")))
  (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) ;_ end of vla-AddLeader
   ) ;_ end of setq
  ;; Меняем настройки будущей аннотации:
 ; (vla-put-height ann_obj (* 1 (getvar "dimscale")))
  (vla-put-attachmentpoint ann_obj
    ;; Назначая точку выравнивания, будем использовать числовые значения:
    ;; acAttachmentPointBottomLeft   ->   7
    ;; acAttachmentPointBottomRight   ->   9
    ;; acAttachmentPointMiddleLeft   ->   4
    ;; acAttachmentPointMiddleRight   ->   6
    (+ 4 (if (> (car end-point) (car start-point)) ; выноска вправо, точка — влево
       0  2) ;_ end of if
       (if (/= low-string "")      ; нижняя строка есть, выр. — по  центру
           0 3) ;_ end of if
       ) ;_ end of +
    ) ;_ end of vla-put-AttachmentPoint
  (vla-put-insertionpoint ann_obj (vlax-3d-point end-point))
  ;; Теперь модицифируем собственно выноску
  (vla-put-verticaltextposition lead_obj acOutside)
  (vla-put-ArrowheadSize lead_obj 0.5)
  ;; В принципе, строка ниже не требуется — так, для страховки.
  (vla-put-coordinate lead_obj 1 (vlax-3d-point end-point)) lead_obj)
  (vl-load-com)
  (initget 1)
  (setq p1 (getpoint "\nТочка: "))
  (initget 1)
  (setq p2 (getpoint p1 "\nНаправление выноски: "))
;;;  (setq p1 (trans p1 1 0)           ;<- Здесь переводим p1 в МСК
;;;  p2 (trans p2 1 0))                ;<- Здесь переводим p2 в МСК
  (_addleader
    (strcat "N=" (rtos (nth 1 p1) 2))
    (strcat "E=" (rtos (nth 0 p1) 2))
    (trans p1 1 0)(trans p2 1 0))(princ))
(princ "\nНаберите в командной строке NE")