Откатывает vla-put-coordinates у выноски(leader)
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Откатывает vla-put-coordinates у выноски(leader)

Откатывает vla-put-coordinates у выноски(leader)

Ответ
Поиск в этой теме
Непрочитано 11.03.2010, 15:12 #1
Откатывает vla-put-coordinates у выноски(leader)
Disney
 
Геодезист
 
Сибирь (где медведи по улицам ходят)
Регистрация: 12.03.2009
Сообщений: 860

Есть код, подписывает координату на выноске, попросили разместить полку между строк, попробовал с помощью vla-put-coordinates
Код:
[Выделить все]
(defun c:geo_koord_leader_2 (/ pod_z koord y x z xyz)
  (vl-load-com)
  (setvar "DIMZIN" 0)
  (initget "Да Нет Lf Ytn _ Y N Y N")
  (setq
    pod_z (getkword "\nПодписывать Z [Да/Нет] <Нет>? : ")
  )
  (while (and
	   (setq koord (getpoint "\nТочка <Выход>"))
	 )
    (setq
      y	(strcat "Y=" (rtos (nth 0 koord) 2 3))
      x	(strcat "X=" (rtos (nth 1 koord) 2 3))
      z	(if
	  (= pod_z "Y")
	   (strcat "Z=" (rtos (nth 2 koord) 2 3))
	   ""
	)
    )
    (VL-cmdf "_leader" koord pause "" x y z "")
    (setq text	    (entlast)
	  Li_sp_dis (vla-get-LineSpacingDistance
		      (vlax-ename->vla-Object text)
		    )
	  D_text    (entdel text)
	  leader    (vlax-ename->vla-Object (entlast))
	  koor	    (vlax-variant-value (vla-get-coordinates leader))
	  new	    (+ (nth 4 (vlax-safearray->list koor)) Li_sp_dis)
    )
    (entdel D_text)
    (vlax-safearray-put-element koor 4 new)
    (vla-put-coordinates leader koor)
    (vla-Update leader)
  )
)
(princ "Вызов функции: geo_koord_leader_2")
Но работает почему-то так
[IMG]http://s43.***********/i101/1003/a6/31e34549fd92.gif[/IMG]
__________________
Почему все вдруг становятся умными, когда уже не надо?

Последний раз редактировалось Disney, 11.03.2010 в 20:20.
Просмотров: 5036
 
Непрочитано 11.03.2010, 15:49
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Скажу честно - LEADER в этом отношении достаточно неустойчивая штука. Я бы с ним особо не связывался.
Вот, казалось бы, по-быстрому накиданный код, работает более-менее, а по окончании все равно идет смещение выноски. Хоть как...
Код:
[Выделить все]
(defun test (/ adoc *error* leader coord ann_point ann)

  (initget "Да Нет Yes No _ Y N Y N")
  (setq	adoc  (vla-get-activedocument (vlax-get-acad-object))
	pod_z (cond
		((getkword "\nПодписывать Z [Да/Нет] <Нет>? : "))
		(t "N")
		) ;_ end of cond
	) ;_ end of setq
  (while (and (= (type (setq coord (vl-catch-all-apply
				     (function
				       (lambda ()
					 (getpoint "\nТочка <Выход> : ")
					 ) ;_ end of lambda
				       ) ;_ end of function
				     ) ;_ end of vl-catch-all-apply
			     ) ;_ end of setq
		       ) ;_ end of type
		 'list
		 ) ;_ end of =
	      coord
	      (= (type (setq ann_point (vl-catch-all-apply
					 (function
					   (lambda ()
					     (getpoint coord "\nТочка выноски <Выход> : ")
					     ) ;_ end of lambda
					   ) ;_ end of function
					 ) ;_ end of vl-catch-all-apply
			     ) ;_ end of setq
		       ) ;_ end of type
		 'list
		 ) ;_ end of =
	      ann_point
	      ) ;_ end of and
    (vla-startundomark adoc)
    (setq ann	    ((lambda (/ res)
		       (setq res (vla-addmtext
				   (vla-get-modelspace adoc)
				   (vlax-3d-point ann_point)
				   0.
				   (strcat "Y="
					   (rtos (car coord) 2 3)
					   "\nX="
					   (rtos (cadr coord) 2 3)
					   (if (= pod_z "Y")
					     "\nZ="
					     (rtos (caddr coord) 2 3)
					     ) ;_ end of if
					   ""
					   ) ;_ end of strcat
				   ) ;_ end of vla-addmtext
			     ) ;_ end of setq
		       (vla-put-attachmentpoint
			 res
			 (if (< (car coord) (car ann_point))
			   acattachmentpointmiddleleft
			   acattachmentpointmiddleright
			   ) ;_ end of if
			 ) ;_ end of vla-put-attachmentpoint
		       (vla-put-insertionpoint res (vlax-3d-point ann_point))
		       res
		       ) ;_ end of lambda
		     )
	  ann_point (vlax-safearray->list
		      (vlax-variant-value
			(vla-get-insertionpoint
			  ann
			  ) ;_ end of vla-get-InsertionPoint
			) ;_ end of vlax-variant-value
		      ) ;_ end of vlax-safearray->list
	  leader    (vla-addleader
		      (vla-get-modelspace adoc)
		      (vlax-make-variant
			(vlax-safearray-fill
			  (vlax-make-safearray
			    vlax-vbdouble
			    '(0 . 5)
			    ) ;_ end of vlax-make-safearray
			  (apply (function append) (list coord ann_point))
			  ) ;_ end of vlax-safearray-fill
			) ;_ end of vlax-make-variant
		      ann
		      aclinewitharrow
		      ) ;_ end of vla-addleader
	  ) ;_ end of setq
    (vla-put-coordinates
      leader
      (vlax-make-variant
	(vlax-safearray-fill
	  (vlax-make-safearray
	    vlax-vbdouble
	    '(0 . 5)
	    ) ;_ end of vlax-make-safearray
	  (apply (function append) (list coord ann_point))
	  ) ;_ end of vlax-safearray-fill
	) ;_ end of vlax-make-variant
      ) ;_ end of vla-put-Coordinates
    (vla-update leader)
    (vla-endundomark adoc)
    ) ;_ end of while
  ) ;_ end of defun
Есть только один вариант: результаты выполнения "засовывать" в отдельный список, и после окончания выполнения функции его обрабатывать принудительно. Но на это сейчас у меня мозгов не хватает
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.03.2010, 01:24
#3
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Тупые америкосы ине подозревают что, можно текст под чертой писа'ть
gomer вне форума  
 
Непрочитано 12.03.2010, 01:38
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,406


Вообще-то есть объект multileader...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.03.2010, 06:24
#5
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Такую выноску с mleader сделать можно. Но сложно. Сложность именно в том, чтобы при редактировании положения не уплывал текст. Прилагаю пример DWG. Формат 2007. Изучайте с свойства.

Вот исходники некоторых основных функций - чтобы примерно понять, как это делается. Разумеется, они не будут работать, так как внутри используется ещё множество разных функций. Но понять алгоритм можно.

Код:
[Выделить все]
(defun ru-draw-mleader-and-two-string (
                                       msg
                                       txt1
                                       txt2
                                       dot_dia
                                       is_multy
                                       start_pnt
                                       /
                                       
                                       end_pnt
                                       ml_obj ml_ent
                                       result
                                       mleader_style_name
                                      )

;;; Мульти выноска с двойным текстом Txt2 может быть нил
;;; (ru-draw-mleader-and-two-string "обозначения диаметра" "%%c 1000" "L=32000"  0 nil nil)
;;; (ru-draw-mleader-and-two-string "обозначения диаметра" "%%c 1000 123456789 сделбали"   nil 1.0 T nil)
;;; (ru-draw-mleader-and-two-string "обозначения установки" "П1"   "Лист 5" 2.0 nil)
; error: Automation Error. Key not found
; reset after error
  
;;; (ru-draw-mleader-and-two-string "обозначения диаметра" txt   nil 1 nil nil)
  (if (null msg) (setq msg ""))
      (if (null start_pnt)
        (setq
          start_pnt (ru-get-point-or-exit (strcat "Начало выноски " msg) nil)
        ) ;_ end of setq
      ) ;_ end of if
      (if start_pnt
        (progn
          (setq end_pnt (ru-get-point-reguired
                          (strcat "Конец выноски " msg)
                          start_pnt
                        ) ;_ end of ru-get-point-reguired
          ) ;_ end of setq
          (if (setq ml_obj
                     (ru-mleader-draw (list start_pnt end_pnt)  dot_dia)

              ) ;_ end of setq
            (progn
             (setq ml_ent (vlax-vla-object->ename ml_obj))
             (setq code  "") 
              (if (and txt2 (/= txt2 ""))
                 (setq txt_string (strcat code txt1 "\n"  txt2))
                 (setq txt_string (strcat code txt1 ""))
              ) ;_ end of if
             (ru-obj-put-property  ml_obj 'textstring  txt_string)
              (if is_multy
                (progn
                  (vl-cmdf "_.MLEADEREDIT" ml_ent "_A")
                  (while (> (getvar "CMDACTIVE") 0)
                    (princ "\nНачало дополнительной выноски <Хватит>: ")
                    (vl-cmdf pause)
                  ) ;_ end of while
                ) ;_ end of progn
              ) ;_ end of if
              
              (setq result t)
            ) ;_ end of progn
          ) ;_ end of if
        ) ;_ end of progn
      ) ;_ end of if
  result
)

(defun ru-mleader-draw
                       (list_points
                        dot_dia
                        /
                        obj
                        ent
                       )
                       
                       ;|
Вариант с командой  без стиля

|;
  (ru-error-catch
    (function
      (lambda ()
        (ru-var-clear-osnap)
        (if 
            (vl-cmdf "_.MLEADER"
                     (trans (car list_points) 0 1)
                     (trans (cadr list_points) 0 1)
                     ""
            ) ;_ end of vl-cmdf
          (progn
            ;; Вот здесь оказывается не MLEADER, а другое.
            ;; потому что vl-cmdf вернула Т, но не построила выноску!
            (setq ent (entlast)
                  obj (vlax-ename->vla-object ent)
            ) ;_ end of setq
            ;;Вставим проверку типа
            (cond
              ((and
                 (vlax-read-enabled-p obj)
                 (vlax-write-enabled-p obj)
               ) ;_ end of and
               (ru-mleader-style-create-block (> dot_dia 0.0))
               (ru-obj-put-property obj 'leaderlineweight aclnwtbylwdefault)

               (cond (*ru_text_size*)
                     (t
                      (setq *ru_text_size*
                             (atof (ru-ini-read
                                     (ru-file-ini "default.ini")
                                     "Setup"
                                     "TextHeight"
                                     "2.5"
                                   ) ;_ end of ic_getIni
                             ) ;_ end of setq
                      ) ;_ end of setq
                     )
               ) ;_ end of cond
               (ru-obj-put-property obj 'textheight *ru_text_size*)
               (ru-obj-put-property
                 obj
                 'lineweight
                 (ru-lw-calc-for-text *ru_text_size*)
               ) ;_ end of ru-obj-put-property
               (ru-obj-put-property obj 'textstylename "RU_CAD")
               ;; Подчеркивание первой строки
               (ru-obj-put-property obj 'textleftattachmenttype 3)
               (ru-obj-put-property obj 'textrightattachmenttype 3)
               ;;--------------------------
               (ru-mleader-up-text obj)
               ;;----------------------------
               (ru-obj-put-property obj 'landinggap 0.0)
               (ru-obj-put-property obj 'doglegged -1)
               (ru-obj-put-property obj 'dogleglength 0)
               (if (> dot_dia 0.0)
                 (progn
                   (ru-obj-put-property obj 'arrowheadtype acarrowdot)
                   (ru-obj-put-property obj 'arrowheadsize dot_dia)
                 ) ;_ end of progn
                 (progn
                   (ru-obj-put-property
                     obj
                     'arrowheadtype
                     acarrownone
                   ) ;_ end of vlax-put-property
                   (ru-obj-put-property obj 'arrowheadsize 0.0)
                 ) ;_ end of progn
               ) ;_ end of if
               (ru-obj-put-property obj 'scalefactor (ru-scale-current-space))
               (vla-update obj)
              )
            ) ;_ end of cond
          ) ;_ end of progn
        ) ;_ end of if
        (ru-var-restore-osnap)
      ) ;_ end of lambda
    ) ;_ end of function
    (function (lambda (x)
                (princ (strcat "\nОШИБКА RU-MLEADER-DRAW " x))
                nil
              ) ;_ end of lambda
    ) ;_ end of function
  ) ;_ end of ru-error-catch
  obj
) ;_ end of defun
Вложения
Тип файла: dwg
DWG 2007
mleader.dwg (70.4 Кб, 744 просмотров)
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 12.03.2010, 07:51
#6
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Вообще-то есть объект multileader...
Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
Такую выноску с mleader сделать можно
С МультиВыноской, в принципе проще, установил в стиле мвыноски подчёркивание 1-ой строки и всё...
__________________
Почему все вдруг становятся умными, когда уже не надо?
Disney вне форума  
 
Непрочитано 12.03.2010, 09:55
#7
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
установил в стиле мвыноски подчёркивание 1-ой строки и всё...
Ну, это сначала кажется, что "и всё".
ShaggyDoc вне форума  
 
Автор темы   Непрочитано 12.03.2010, 15:16
#8
Disney

Геодезист
 
Регистрация: 12.03.2009
Сибирь (где медведи по улицам ходят)
Сообщений: 860
Отправить сообщение для Disney с помощью Skype™


Цитата:
Сообщение от ShaggyDoc
Ну, это сначала кажется, что "и всё".
Я имею ввиду в ручную пользователем самому настроить стиль Мвыноски, а не программно.

Попытался пойти др. путём, если у Мтекста изменить выравнивание с нижнего на верхнее, и ввести пользовательскую высоту равную высоте текста, то полка таки расположиться между строк.
[IMG]http://s003.***********/i203/1003/b5/7350578444cf.gif[/IMG]
сначала попробовал через (entmod), почему опять не воспринимает изменение DXF кодов 71(выравнивание) и 46 (высота).
Попробовал выравнивание через ActiveX attachmentpoint, работает замечательно , но без пользовательской высоты толку всё равно нет, а его в ActiveX не нашёл

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

Последний раз редактировалось Disney, 15.03.2010 в 14:14.
Disney вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Откатывает vla-put-coordinates у выноски(leader)



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Lisp. Изменение свойств у ячеек таблицы. Не могу докопаться до vla объекта. Kirzaa LISP 2 21.09.2009 10:32
DwgRuLispLib: Преобразование указателя на примитив в vla Кулик Алексей aka kpblc Библиотека функций 5 27.12.2007 13:47