Реклама i
Стань нашим партнером - зарабатывай с нами!
| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Лисп простой пользовательской выноски

Лисп простой пользовательской выноски

Ответ
Поиск в этой теме
Непрочитано 21.03.2016, 10:37 #1
Лисп простой пользовательской выноски
Сет
 
Регистрация: 19.11.2014
Сообщений: 2,435

Указал в заголовке, что речь о простой выноске, но может она и не простая. Прошу помощи в реализации, если это просто решается или подсказать направление куда думать, если сложная реализация.

Внешний вид выноски представлен на картинке во вложении.

Порядок запросов на ввод пользователя:
1. Введите верхний текст.
2. Укажите первую точку выноски.
3. Укажите вторую точку выноски.
4. Укажите третью точку выноски.

Как это должно работать.
1. Выноска должна быть ВСЕГДА на определенном слое, даже если активен другой. Изменить слой можно только вручную.
2. Выносная линия - это полилиния нулевой шириной, ее толщина определяется по слою.
3. Текст - вероятно мультитекст, так как нужно выравнивание. Шрифт текста, высота текста и отступ от полки - фиксированы в программе.
4. Положение текста определяется автоматически, в зависимости от введенных значений точек и выравнивается по краю горизонтальной полки.
5. В процессе задания точек хотелось бы видеть промежуточные сегменты, как это видно при отрисовке, например, полилинии. Промежуточная отрисовка текста - не важна.
6. Задание точек должно реагировать на режим ОРТО.
7. Ввод нижнего текста должен быть опциональным. Не знаю можно ли это реализовать без дополнительного запроса на нижний текст. По умолчанию текста нет.
8. Отрисовка точки на конце выноски - тоже опциональна. По идее можно сделать дополнительный запрос на точку, но хотелось бы, чтобы всегда работало значение по умолчанию - без точки. А если она нужна - это бы задавалось как-то дополнительно.

Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 340
Размер:	2.5 Кб
ID:	167235  

Просмотров: 18334
 
Непрочитано 21.03.2016, 12:07
#2
Кулик Алексей aka kpblc
Moderator

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


И в чем собственно трудность?
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 21.03.2016, 12:23
#3
_Roman_


 
Регистрация: 18.02.2016
Сообщений: 42


SPDS, который бесплатный, все это может. Не?
_Roman_ вне форума  
 
Непрочитано 21.03.2016, 12:48
#4
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Чем стандартный mleader (или просто leader) не устраивает?
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 21.03.2016, 12:48
#5
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,435


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И в чем собственно трудность?
Трудность в том, что базовые познания LISP у меня минимальные и посему ищу помощи.

Цитата:
Сообщение от _Roman_ Посмотреть сообщение
SPDS, который бесплатный, все это может. Не?
Файлы с этими выносками могут использоваться другими пользователями, у которых СПДС нет.

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Krieger Посмотреть сообщение
Чем стандартный mleader (или просто leader) не устраивает?
Отступ от полки неконтролируемый.

----- добавлено через ~2 ч. -----
Мой текущий прогресс:

Код:
[Выделить все]
 (vl-load-com)
(defun c:MyLeader(/)
(setq acad_application (vlax-get-acad-object))
(setq active_document (vla-get-ActiveDocument acad_application))
(setq model_space (vla-get-ModelSpace active_document))
(setq t1 (getstring "Введите верхний текст:"))
(setq p1 (getpoint "Введите первую точку:"))
(setq p2 (getpoint p1 "Введите вторую точку:"))
(command "_line" p1 p2 "")
(setq p3 (getpoint p2 "Введите третью точку:"))
(command "_line" p2 p3 "")
(setq x1 (nth 0 p1))
(setq x2 (nth 0 p2))
(setq x3 (nth 0 p3))
(setq y1 (nth 1 p1))
(setq y2 (nth 1 p2))
(setq y3 (nth 1 p3))
(if (> x3 x2)
  (progn
    (if (> y2 y1)
      ; справа вверху
      (progn
        (setq obj (vla-AddMText model_space (vlax-3D-point (list x2 (+ y2 350) 0)) (- x3 x2) t1))
        (vla-put-AttachmentPoint obj acAttachmentPointTopRight)
      )
      ; справа внизу
      (progn
        (setq obj (vla-AddMText model_space (vlax-3D-point (list x2 (+ y2 350) 0)) (- x3 x2) t1))
        (vla-put-AttachmentPoint obj acAttachmentPointTopRight)
      )
    )
  )
  (progn
    (if (> y2 y1)
      ; слева вверху
      (progn
        (setq obj (vla-AddMText model_space (vlax-3D-point (list x3 (+ y3 350) 0)) (- x2 x3) t1))
        (vla-put-AttachmentPoint obj acAttachmentPointTopLeft)
      )
      ; слева внизу
      (progn
        (setq obj (vla-AddMText model_space (vlax-3D-point (list x3 (+ y3 350) 0)) (- x2 x3) t1))
        (vla-put-AttachmentPoint obj acAttachmentPointTopLeft)
      )
    )
  )
)
)
Чего пока не хватает:
1. Отрисовка выносной линии полилинией (с визуализацией промежуточных сегментов), а не двумя отрезками.
2. Размещение всех примитивов на определенном слое, а не текущем.
3. Отрисовка текста определенным шрифтом и определенной высоты, а не текущими значениями.
4. Запоминание предыдущего значения текстовой метки и предложение ее значением по умолчанию при повторном вызове функции.
5. Пока не понимаю как сюда вписать нижнюю текстовую метку, чтобы она была опциональной и не требовала лишнего запроса.
6. С точкой та же история, что и с нижним тектом - точка должна быть опциональной.
Сет вне форума  
 
Непрочитано 21.03.2016, 17:23
#6
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Цитата:
Сообщение от Сет Посмотреть сообщение
Отступ от полки неконтролируемый.
Благодаря VVA вполне себе контролируемый.

Весело будет когда кто-то захочет это дело подредактировать. Вот он спасибо-то скажет. Допустим, стало необходимо добавить еще выносок, а эти передвинуть. И понеслась.
Согласен с теми, кто отсылает к мультивыноскам. При правильной настройке и с использованием MTLE из кода по ссылке. Например, в стиле мультивыноски можно поставить на конце выноски любой блок, скорее, тут даже стандартный подойдет. И это будет один объект, создаваемый уже имеющимися средствами и удобно редактируемый. На форуме была и программа по отрисовке мультивыноски. Советую разобраться с ними и увидите, что это намного удобнее. На худой конец можно поискать динамический блок выноски. В Download и в темах "Мои динамические блоки" (части первая и вторая) предложено немало решений.
skkkk вне форума  
 
Непрочитано 21.03.2016, 20:09
#7
Alan

CAD
 
Регистрация: 28.08.2003
Киев
Сообщений: 1,835
<phrase 1=


Цитата:
Сообщение от Сет Посмотреть сообщение
Прошу помощи в реализации, если это просто решается или подсказать направление куда думать, если сложная реализация.
Одна из первых команд, которая пишется при освоении ЛИСП"па.
Садись и пиши!
Как-то даже и думать за ТС не хочется.
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Автор темы   Непрочитано 21.03.2016, 20:24
#8
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,435


Цитата:
Сообщение от Alan Посмотреть сообщение
Одна из первых команд, которая пишется при освоении ЛИСП"па.
Мне осваивать лисп как таковой не нужно... нужна только описанная мной функция.
Сет вне форума  
 
Непрочитано 21.03.2016, 20:36
#9
Кулик Алексей aka kpblc
Moderator

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


Добро пожаловать в "Поиск исполнителей"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 21.03.2016, 21:09
#10
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,435


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Добро пожаловать в "Поиск исполнителей"
Не думал, что эта функция настолько сложна для людей в теме... ОК
Сет вне форума  
 
Непрочитано 22.03.2016, 01:34
1 | #11
skkkk


 
Регистрация: 20.03.2008
Сообщений: 2,653


Сет, а кто и когда будет решать, и на основании чего, в какую сторону должна эта выноска смотреть?

Я повторю и разверну свою мысль. Плохо это - изобретать велосипед, причем такой, который уступает по своим возможностям штатному функционалу. Но, "не поумничать ради, а помочь для", готов еще раз повторить и попробовать-таки склонить настроение в сторону мультивыноски. Или динамического блока. На этот раз с более вразумительными и осязаемыми доводами. В приложенном файле примеры: сверху - мультивыноска, снизу динамический блок (найден на этом форуме или в дауне).
Для отрисовки таких мультивыносок можно использовать чуть подправленную программу VVA отсюда (код запускать в приложенном файле при активном стиле мультивыносок "ISOCPEUR", который уже присутствует в файле и примерно настроен в соответствии с рисунком в первом посте):
Код:
[Выделить все]
 (vl-load-com)
(defun C:TEST ( / str1 str2 pt1 pt2 strlist) 
	(setq str1 (getstring T "\nВведите первую строку:"))
	(if str1 
		(setq str2 (getstring T "\nВведите вторую строку <Enter - пропустить>:")
			  pt1 (getpoint "\nУкажите первую точку:")
			  pt2 (getpoint pt1 "\nУкажите вторую точку:")
			  strlist (list
						str1
						(if str2 str2)
			  
					  )
		)
	)
	(if (and str1 pt1 pt2)
		(draw-mleader pt1 pt2 strlist 2.5 0.87 0.2)
	
	)
			
)

(defun draw-mleader (pt1 pt2 strlist Htxt koeff abz / dic mlst i)
  ;;; pt1 - начальная точка UCS
  ;;; pt2 - конечная точка UCS
  ;;; strlist - список строк
  ;;; Htxt - высота текста
  ;;; koeff - коэфф форматирования pxe или nil
  ;;; abz - коэфф форматирования абзаца \\pa или Nil
  ;;;(draw-mleader (setq pt1(getpoint))(getpoint pt1)(list "Пример" "Минскинжпроект" "Третья строка") 1.5 0.9 nil)
 ;;; Стиль мультивыноски текущий
  (setq i 0)
  (command
    "_mleader"
    ; "_h"
    ; "_none"
    pt1
    ; "_none"
    pt2
  ; (strcat (if koeff (strcat "\\px"
                              ; (if abz (strcat "a"(VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR abz))",") "")
                              ; "se" (VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR koeff))";") "")   ;;;"\\pxse0.87;"
;;;            "\\pa0.15;" (car strlist) "\\pa0;"
              ; (car strlist)
    ; )
	0
	""
    )
  (while (> (getvar "CMDACTIVE") 0) (command ""))
  (setq dic (vlax-ename->vla-object (entlast)))
  (vla-put-TextString dic
    (strcat (if koeff (strcat "\\px"
                              (if abz (strcat "a"(VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR abz))",") "")
                              "se" (VL-STRING-RIGHT-TRIM "0" (MIP-CONV-TO-STR koeff))";") "")   ;;;"\\pxse0.87;"
;;;            "\\pa0.15;" (car strlist) "\\pa0;"
              (car strlist)
;;;              (if abz "\\pa0;" "")
            (apply 'strcat
                   (mapcar '(lambda (x) (strcat "\\P" (if (= (setq i (1+ i)) 1)(if abz "\\pa0;" "")   "")  x)) (cdr strlist))
            ) ;_ end of apply
    ) ;_ end of strcat
  )
    (vla-put-TextHeight dic Htxt)
    dic
  )
  (defun mip-conv-to-str (dat)
      (cond ((= (type dat) 'INT) (setq dat (itoa dat)))
            ((= (type dat) 'REAL) (setq dat (rtos dat 2 12)))
            ((null dat) (setq dat ""))
            (t (setq dat (vl-princ-to-string dat)))
      ) ;_ end of cond
    ) ;_ end of defun
Динамический блок выноски, думаю, лучше вставлять через палитру инструментов, или программно с запросом артибутов, предварительно программно же подгрузив блок в чертеж.

Цитата:
Сообщение от Сет Посмотреть сообщение
Как это должно работать.
1. Выноска должна быть ВСЕГДА на определенном слое, даже если активен другой. Изменить слой можно только вручную.
2. Выносная линия - это полилиния нулевой шириной, ее толщина определяется по слою.
3. Текст - вероятно мультитекст, так как нужно выравнивание. Шрифт текста, высота текста и отступ от полки - фиксированы в программе.
4. Положение текста определяется автоматически, в зависимости от введенных значений точек и выравнивается по краю горизонтальной полки.
5. В процессе задания точек хотелось бы видеть промежуточные сегменты, как это видно при отрисовке, например, полилинии. Промежуточная отрисовка текста - не важна.
6. Задание точек должно реагировать на режим ОРТО.
7. Ввод нижнего текста должен быть опциональным. Не знаю можно ли это реализовать без дополнительного запроса на нижний текст. По умолчанию текста нет.
8. Отрисовка точки на конце выноски - тоже опциональна. По идее можно сделать дополнительный запрос на точку, но хотелось бы, чтобы всегда работало значение по умолчанию - без точки. А если она нужна - это бы задавалось как-то дополнительно.
Пробежимся по пунктам:
1,2,3 - С этим проблем нет - ни в случае с блоком, ни с выноской - реализуется легко, даже самостоятельно находятся на форуме решения при даже примитивном знании лиспа на уровне чуть больше просто юзера. Думаю, и ссылками поможем, в случае, если выноски пойдут в дело.
4. Ничего не понял из этого пункта - с учетом написанного и нарисованного в первом посте.
5. Тоже по рисунку и описанию не совсем понял, выноска может быть многоступенчатой или "многострелочной"? Для понимания нужен соответствующий рисунок, желательно в dwg.
6. Тут вроде тоже проблем нет.
7. В коде (команда TEST) это реализовано в первом приближении. Если на запрос второго текста нажать правой кнопкой мыши или Enter - второй строки не будет.
8. Это тоже нетрудно добавить.

В общем, если есть желание завязаться с любым из этих вариантов, я готов помочь в поиске и заточке кода или блока. Думаю, что и не я один. С текстами связываться не стану - даже за деньги, и даже, если будет время.
Вложения
Тип файла: dwg
DWG 2010
Мультивыноски и блоки.dwg (94.9 Кб, 63 просмотров)

Последний раз редактировалось skkkk, 22.03.2016 в 01:39.
skkkk вне форума  
 
Непрочитано 22.03.2016, 06:43
1 | #12
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Если это что то стандартное, то использовал бы стандартные лидеры или мультилидеры, вот самый простой:
Код:
[Выделить все]
^C^C_Leader;\\;;;
Создать кнопку такую на палитре и задать в свойствах кнопки слой.

Если что-то не стандартное, то я бы сделал динамический блок со всеми необходимыми вкусняшками, нафиг их программно пытаться полилинией обрисовать, да и не отредактировать потом толком. А дальше пишем прогу по вставке этого блока, например такую:

Код:
[Выделить все]
 ;(kr_DrawLeader "Kr_leader" "ОбозначенияВыноски" "Точка")

(defun kr_DrawLeader (block layer arrow / cmd p1 p2 text1 text2 pr)
  (if (setq p1 (getpoint "\nУкажите первую точку"))
      (if (setq p2 (getpoint p1 "\nУкажите вторую точку"))
	(if (setq text1 (getstring t "\nУкажите первую строку: "))
	  
	(progn
	  	(setq text2 (getstring t "\nУкажите вторую строку: "))
		(setq cmd (getvar "CMDECHO"))
	    	(setvar "CMDECHO" 0)
	  	(vl-cmdf "_insert" block "_s" 1 "_r" 0 "_none" p1 text1 text2)
	    	(setvar "CMDECHO" cmd)
		(setq	pr (entget (entlast))
			pr (subst (cons 8 layer) (assoc 8 pr) pr))
		(entmod pr)
		(setq block (entlast))
		(_kpblc-block-dyn-change-values block (list (cons "Distance1" (distance p1 p2))
								    (cons "Angle" (angle (trans p1 0 1) (trans p2 0 1)))
								    (cons "Distance" (* (max (strlen text1) (strlen text2)) 1.45 (Kr_Scale nil)))
								    (cons "Visibility" arrow)
								    ))
		(princ)
	);progn 
	);if
	);if
    );if
  );defun




(defun _kpblc-block-dyn-change-values (ent              lst
                                       /                prop_lst
                                       _kpblc-conv-vla-to-list
                                       )
                                      ;|
	ent	указатель на вхождение блока
	lst	список вида:
      '((<property> . <value>)
	(<property> . <value>)
	)
*    примеры вызова:
(_kpblc-block-dyn-change-values (car(entsel))'(("dist*" . 162.56) ("ang*" . 5.)))
;; Углы надо задавать в радианах!
(_kpblc-block-dyn-change-values (car (entsel)) '(("type" . "minimum")))
|;

  (defun _kpblc-conv-vla-to-list (value / res)
                                 ;|
*    Преобразовывает vlax-variant или vlax-safearray в список.
|;
    (cond
      ((= (type value) 'variant)
       (_kpblc-conv-vla-to-list (vlax-variant-value value))
       )
      ((= (type value) 'safearray)
       (if (>= (vlax-safearray-get-u-bound value 1) 0)
         (vlax-safearray->list value)
         ) ;_ end of if
       )
      (t value)
      ) ;_ end of cond
    ) ;_ end of defun

  (vl-load-com)

  (vl-catch-all-apply
    '(lambda ()
       (setq
         ent (cond
               (ent)
               (t (car (entsel "\nУкажите вхождение дин.блока <Отмена> : ")))
               ) ;_ end of cond
         ) ;_ end of setq
       ) ;_ end of lambda
    ) ;_ end of vl-catch-all-apply
  (if (and ent
           (setq ent (cond
                       ((= (type ent) 'ename) (vlax-ename->vla-object ent))
                       ((= (type ent) 'vla-object) ent)
                       (t nil)
                       ) ;_ end of cond
                 ) ;_ end of setq
           (= (strcase (vla-get-objectname ent) t) "acdbblockreference")
           (= (vla-get-isdynamicblock
                (vla-item
                  (vla-get-blocks
                    (vla-get-activedocument (vlax-get-acad-object))
                    ) ;_ end of vla-get-blocks
                  (vla-get-effectivename ent)
                  ) ;_ end of vla-item
                ) ;_ end of vla-get-isdynamicblock
              :vlax-true
              ) ;_ end of =
           ) ;_ end of and
    (progn
      (setq
        prop_lst (vlax-safearray->list
                   (vlax-variant-value (vla-getdynamicblockproperties ent))
                   ) ;_ end of vlax-safearray->list
        ) ;_ end of setq
      (foreach item (mapcar '(lambda (a) (cons (strcase (car a)) (cdr a))) lst)
        (if (setq prop
                   (car
                     (vl-remove-if-not
                       '(lambda (x)
                          (wcmatch (strcase (vla-get-propertyname x)) (car item))
                          ) ;_ end of lambda
                       prop_lst
                       ) ;_ end of vl-remove-if-not
                     ) ;_ end of car
                  ) ;_ end of setq
          ;; Имя совпало
          (vl-catch-all-apply
            '(lambda ()
               (vla-put-value
                 prop
                 (vlax-make-variant
                   (cdr item)
                   (vlax-variant-type (vla-get-value prop))
                   ) ;_ end of vlax-make-variant
                 ) ;_ end of vla-put-value
               (vla-update ent)
               ) ;_ end of lambda
            ) ;_ end of vl-catch-all-apply
          ) ;_ end of if
        ) ;_ end of foreach
      ) ;_ end of progn
    ) ;_ end of if
  ) ;_ end of defun




;|---------------------------------------------------------------
Функция Kr_Scale
-----------------------------------------------------------------
Вычисляет масштаб в зависимоти от переменной dimscale или CANNOSCALEVALUE, если dimscale=0 коэф-т = 1 или относительно vport
Параметры
An - Признак аннотативного объекта для которого используется функция:
	nil - не аннотативный
	t   - аннотативный
|;
(defun Kr_Scale (An / )
  (if (and An (= (getvar "dimanno") 1)) (setq dsc 1)
  ;если текущим установлен аннотативный размерный стиль, масштаб берем с аннотативного масштаба
  (if (= (getvar "dimanno") 1)
    (setq dsc (/ 1 (getvar "CANNOSCALEVALUE")))
    (progn
  ;если dimscale=0 принимаем dsc=1, если нет dsc=dimscale
  			(if (= (getvar "dimscale") 0) (setq dsc 1) (setq dsc (getvar "dimscale")))
  ;если мы находимся в пространстве листа:
			(if (= (Getvar "TILEMODE") 0)
  ;если видовое окно не ативно dsc=1, если активно, то берем масштаб с видового экрана
			  (if (= (Getvar "CVPORT") 1)
			    (setq dsc 1)
			    (setq dsc (/ 1 (vla-get-CustomScale (vla-get-ActivePViewport (vla-get-ActiveDocument (vlax-get-Acad-Object))))))
			  );if
			 );if
      );progn
    );if
   );if
    dsc
)
Блок должен быть в файле. Как он там окажется, это уже другой вопрос. Проверок на наличие блока не делал. Блок аннотативный.
Вложения
Тип файла: dwg
DWG 2010
kr_leader.dwg (65.3 Кб, 46 просмотров)
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 22.03.2016, 09:58
#13
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,435


Цитата:
Сообщение от skkkk Посмотреть сообщение
готов еще раз повторить и попробовать-таки склонить настроение в сторону мультивыноски
Я вижу следующие недостатки мультивыноски, по крайней мере для моих задач:
1. У меня часто в одном чертеже используются выноски с точкой и без точки. Это, если хотите, мой собственный стандарт оформления, согласно которого выноска от тонкого элемента идет без точки, а от широкого - с точкой. Если работать с мультивыноской, то нужно будет создать два стиля и часто их переключать, либо менять стиль мультивыносок в свойствах. Пусть это и не выглядит критическим, но, думается, будет не слишком удобным.
2. Полка выноски всегда имеет правое положение, хотя левое положение используется у меня также часто.
3. Длина полки выноски неконтролируемая "на лету".
4. Раньше, при тестировании мультивыносок, я сталкивался с тем, что текст на ней размещается некорректно. Какой-то с отступом от полки, какой-то чуть ли не вплотную. У вашей мультивыноски при беглом тестировании я этой проблемы не обнаружил, но я не помню какие именно символы нарушали стройную геометрию. Надо потестировать еще.

При минусах есть и один несомненный плюс - выноска является единым целым.

Цитата:
Сообщение от skkkk Посмотреть сообщение
Или динамического блока.
Цитата:
Сообщение от Krieger Посмотреть сообщение
Если что-то не стандартное, то я бы сделал динамический блок со всеми необходимыми вкусняшками, нафиг их программно пытаться полилинией обрисовать, да и не отредактировать потом толком.
Недостатки динамических блоков.
1. Первое и очевидное - слишком много действий по добавлению такого блока в чертеж. Сначала блок нужно вставить, затем потягать за ручки, чтобы он принял нужную форму. Выносок в чертеже много, если каждой уделять столько времени - это будет слишком расточительно.
2. Текст нужно выравнивать не по центру полки, а по краю выноски. Соответственно динамически "отзеркаливать" полку не получится. Нужно будет либо делать 4 области видимости с разными положениями выноски, либо 4 разных динамических блока, которые потом "тягать" с палитры.
3. Есть мнение, что большое количество динамических блоков "тормозит" чертеж. Выносок очень много. Динамические блоки я использую и кроме них.


Цитата:
Сообщение от skkkk Посмотреть сообщение
4. Ничего не понял из этого пункта - с учетом написанного и нарисованного в первом посте.
Ну например, если вторая точка имеет координату X больше, чем третья точка - значит полка слева и текст нужно выравнивать по левому краю. Собственно, я эту механику уже реализовал.
Цитата:
Сообщение от skkkk Посмотреть сообщение
5. Тоже по рисунку и описанию не совсем понял, выноска может быть многоступенчатой или "многострелочной"? Для понимания нужен соответствующий рисунок, желательно в dwg.
Выноска простая - одна выносная линия и полка. Два сегмента. Всегда.

Собственно мой прогресс:
Код:
[Выделить все]
 (vl-load-com)
(defun c:MyLeader(/)
(setq acad_application (vlax-get-acad-object))
(setq active_document (vla-get-ActiveDocument acad_application))
(setq model_space (vla-get-ModelSpace active_document))
(setq t1 (getstring "Введите верхний текст:"))
(setq p1 (getpoint "Введите первую точку:"))
(setq p2 (getpoint p1 "Введите вторую точку:"))
(setq temp_line (vla-AddLine model_space (vlax-3D-point p1) (vlax-3D-point p2)))
(vla-put-Layer temp_line "000-Серый")
(setq p3 (getpoint p2 "Введите третью точку:"))
(setq finish_line 
  (vla-AddPolyline model_space 
    (vlax-safearray-fill
      (vlax-make-safearray vlax-vbDouble '(0 . 8))
      (append p1 p2 p3)
    )
  )
)
(vla-put-Layer finish_line "000-Серый")
(vla-Delete temp_line)
(setq x1 (nth 0 p1))
(setq x2 (nth 0 p2))
(setq x3 (nth 0 p3))
(setq y1 (nth 1 p1))
(setq y2 (nth 1 p2))
(setq y3 (nth 1 p3))
(if (> x3 x2)
  (progn    
    (setq obj (vla-AddMText model_space (vlax-3D-point (list x2 (+ y2 320) 0)) (- x3 x2) t1))
    (vla-put-AttachmentPoint obj acAttachmentPointTopRight)  
  )
  (progn
    (setq obj (vla-AddMText model_space (vlax-3D-point (list x3 (+ y3 320) 0)) (- x2 x3) t1))
    (vla-put-AttachmentPoint obj acAttachmentPointTopLeft)
  )
)
(vla-put-Layer obj "000-Серый")
(vla-put-StyleName obj "Шрифт 10")
(vla-put-Height obj 250)
)
Оставшиеся недостатки:
1. Запоминание предыдущего значения текстовой метки и предложение ее значением по умолчанию при повторном вызове функции.
2. Опциональный нижний текст. Вариант с индивидуальным запросом (как в мультивыноске VVA) понятен, но выглядит неудобным. Хотелось бы, чтобы пустой нижний текст не требовал лишних действий, которые нужно выполнять только если нижний текст имеет содержимое.
3. Все что касается нижнего текста - касается и точки.

Добавилось еще одно желаемое свойство:
1. После указания первой точки должен включаться режим ОРТО (если он выключен) и по завершению работы функции - возвращаться в исходное состояние.

Последний раз редактировалось Сет, 22.03.2016 в 10:42.
Сет вне форума  
 
Непрочитано 22.03.2016, 10:38
1 | #14
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Цитата:
Сообщение от Сет Посмотреть сообщение
Недостатки динамических блоков.
1. Первое и очевидное - слишком много действий по добавлению такого блока в чертеж. Сначала блок нужно вставить, затем потягать за ручки, чтобы он принял нужную форму. Выносок в чертеже много, если каждой уделять столько времени - это будет слишком расточительно.
Ну так для этого и пишется программа для её вставки в два клика, точно также как и обычный лидер.
Цитата:
2. Текст нужно выравнивать не по центру полки, а по краю выноски. Соответственно динамически "отзеркаливать" полку не получится. Нужно будет либо делать 4 области видимости с разными положениями выноски, либо 4 разных динамических блока, которые потом "тягать" с палитры.
Атрибуты в динблоках выравниваются как угодно и даже зеркалятся корректно, во всяком случае их редактирование не сложнее правки отдельно стоящего текста. Можно и разных блоков или видимостей наделать, как ты говоришь наделать, какая разница? Управлять то ими будет программа.
Цитата:
3. Есть мнение, что большое количество динамических блоков "тормозит" чертеж. Выносок очень много. Динамические блоки я использую и кроме них.
mleader forever

Цитата:
Оставшиеся недостатки:
1. Запоминание предыдущего значения текстовой метки и предложение ее значением по умолчанию при повторном вызове функции.
Ну и запоминай в глобальной переменной, а потом предлагай.
Код:
[Выделить все]
(setq text "dddd")
(setq text (getstring t (strcat "\nВведите текст <" text ">: ")))
Цитата:
3. Все что касается нижнего текста - касается и точки.
4. С точкой та же история, что и с нижним тектом - точка должна быть опциональной.
Как то делал выноску у которой сначала нужно было выбрать объект, а потом уже место начала выноски, если указка начала выноски завершалась пустым вводом, то рисовалась стрелка с места где указывали объект, если нет, то была точка. Можешь тоже попробовать как то формализовать, то что подписываешь.
Цитата:
Добавилось еще одно желаемое свойство:
1. После указания первой точки должен включаться режим ОРТО (если он выключен) и по завершению работы функции - возвращаться в исходное состояние.
Меняй переменную ORTHOMODE и сохраняй/восстанавливай переменную POLARMODE

Удачи в велосипедостроении.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 22.03.2016, 10:44
1 | #15
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


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

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

Increase Size Decrease Size Нажмите для просмотра
http://youtu.be/-NmXNyjWPTw
Increase Size Decrease Size Нажмите для просмотра
http://www.youtube.com/watch?v=Y45rqpJlMh4
Скоро я покажу как автоматически расставлять выноски к блокам, так, чтобы в них писались данные, и выноски не накладывались на другие объекты.

Здесь выноски расставляются, но не красиво, все в одну сторону, что требует ручной подчистки.

Increase Size Decrease Size Нажмите для просмотра
http://www.youtube.com/watch?v=74EZGo9p9Y0

Последний раз редактировалось Sleekka, 22.03.2016 в 10:51.
Sleekka вне форума  
 
Автор темы   Непрочитано 22.03.2016, 10:47
#16
Сет


 
Регистрация: 19.11.2014
Сообщений: 2,435


Цитата:
Сообщение от Krieger Посмотреть сообщение
Ну так для этого и пишется программа для её вставки в два клика, точно также как и обычный лидер.
Имеется ввиду программа вставки динамического блока с нужными опциями? Какой смысл вставлять именно динамический блок, если все то же достигается простыми примитивами. Вот действия по вставке моей выноски:
1. Клик - активация функции.
2. Ввод текста - текст выноски.
3. Клик - первая точка.
4. Клик - вторая точка.
5. Клик - третья точка.
Всего четыре клика и ввод текста - и выноска занимает нужное положение и вид.
Сет вне форума  
 
Непрочитано 22.03.2016, 10:53
#17
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Сообщение от Сет Посмотреть сообщение
1. Клик - активация функции.
2. Ввод текста - текст выноски.
3. Клик - первая точка.
4. Клик - вторая точка.
5. Клик - третья точка.
Всего четыре клика и ввод текста - и выноска занимает нужное положение и вид.
Посмотри второе видео в моем сообщении, когда ничего не выделено, выноска работает так как ты говоришь, только третья точка вычисляется автоматически. И полка потом может быть пересчитана, двойным кликом.
Sleekka вне форума  
 
Непрочитано 22.03.2016, 10:59
#18
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Цитата:
Сообщение от Сет Посмотреть сообщение
Имеется ввиду программа вставки динамического блока с нужными опциями? Какой смысл вставлять именно динамический блок, если все то же достигается простыми примитивами. Вот действия по вставке моей выноски:
1. Клик - активация функции.
2. Ввод текста - текст выноски.
3. Клик - первая точка.
4. Клик - вторая точка.
5. Клик - третья точка.
Всего четыре клика и ввод текста - и выноска занимает нужное положение и вид.
По итогу это будет цельный объект, с которым работать в последствии будет легче, чем с разрозненными примитивами. Вот и все. Я, так понимаю, ты мою прогу не смотрел. Вот действия по вставке моей выноски:
1. Нажатие кнопки
2. Указали первую точку
3. Указали вторую точку
4. Написали текст первой строки
5. Написали текст второй строки (если нужно, если не нужно просто жмем ПКМ)
Всего три клика и ввод текста. На один клик меньше )

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Sleekka Посмотреть сообщение
Посмотри второе видео в моем сообщении, когда ничего не выделено, выноска работает так как ты говоришь, только третья точка вычисляется автоматически. И полка потом может быть пересчитана, двойным кликом.
Как ты вычисляешь длину текста?
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Непрочитано 22.03.2016, 11:15
#19
Sleekka

-
 
Регистрация: 24.07.2005
Москва
Сообщений: 1,335


Цитата:
Сообщение от Krieger Посмотреть сообщение
Как ты вычисляешь длину текста?
Как обычно, через BoundingBox, это далеко не самое сложно в этой задачке.
Для меня было самое сложно сохранить удобство одного общего объекта не потеряв удобства раздельных объектов, найти этот тонкий баланс и есть самое сложное. При этом я не пишу никаких расширенных данных в примитивы, только анализ геометрии для сохранения связности.
Sleekka вне форума  
 
Непрочитано 22.03.2016, 11:27
#20
Krieger

инженер (КМ)
 
Регистрация: 30.10.2004
Красноярск
Сообщений: 3,825


Цитата:
Сообщение от Sleekka Посмотреть сообщение
Как обычно, через BoundingBox, это далеко не самое сложно в этой задачке.
Для меня было самое сложно сохранить удобство одного общего объекта не потеряв удобства раздельных объектов, найти этот тонкий баланс и есть самое сложное. При этом я не пишу никаких расширенных данных в примитивы, только анализ геометрии для сохранения связности.
Большая, хорошая работа. Но зачем. Есть же выноски...
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Лисп простой пользовательской выноски

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Комрады, не работает простой лисп по копированию отрезка. MegaMost LISP 10 07.09.2015 00:23
Как визуализировать создаваемый объект? Glorius Программирование 27 08.08.2015 22:59
мой первый лисп, выноска, пинайте! baaba LISP 17 20.10.2009 15:42
Помогите продумать поворот части выноски! Tonic Программирование 40 02.07.2007 20:21
Сброс связи линии выноски и MTEXTа выноски kabzzz AutoCAD 3 19.04.2006 12:57