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

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

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

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

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

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

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

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

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

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

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


И в чем собственно трудность?
__________________

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


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


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

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


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


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


Цитата:
Сообщение от Кулик Алексей 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

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


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

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

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


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


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


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

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


Добро пожаловать в "Поиск исполнителей"
__________________

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


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


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

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


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

Я повторю и разверну свою мысль. Плохо это - изобретать велосипед, причем такой, который уступает по своим возможностям штатному функционалу. Но, "не поумничать ради, а помочь для", готов еще раз повторить и попробовать-таки склонить настроение в сторону мультивыноски. Или динамического блока. На этот раз с более вразумительными и осязаемыми доводами. В приложенном файле примеры: сверху - мультивыноска, снизу динамический блок (найден на этом форуме или в дауне).
Для отрисовки таких мультивыносок можно использовать чуть подправленную программу 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 Кб, 52 просмотров)

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

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


Если это что то стандартное, то использовал бы стандартные лидеры или мультилидеры, вот самый простой:
Код:
[Выделить все]
^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 Кб, 39 просмотров)
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 22.03.2016, 09:58
#13
Сет


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


Цитата:
Сообщение от 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,784


Цитата:
Сообщение от Сет Посмотреть сообщение
Недостатки динамических блоков.
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,455


Согласен с автором, что нужно свою делать. Когда-то была своя на основе дин.блока.
Теперь новый виток. Но без отличного знания 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
Сообщений: 1,517


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

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


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

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


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

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

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


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

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


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


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
Я, так понимаю, ты мою прогу не смотрел.
kr_leader? Смотрел. Просто вставляет динамический блок. Или речь о чем-то другом?

Цитата:
Сообщение от Sleekka Посмотреть сообщение
Посмотри второе видео в моем сообщении, когда ничего не выделено, выноска работает так как ты говоришь, только третья точка вычисляется автоматически. И полка потом может быть пересчитана, двойным кликом.
Это все круто, конечно. Я бы хотел задействовать как-то реакторы, чтобы полка бегала за текстом, а текст за полкой... но думаю, что это слишком сложно и требует действительно плотного изучения ЛИСПа или действительно обращения в "Поиск исполнителей" Я же ставил себе целью создание ПРОСТОЙ выноски. Собственно, цель почти достигнута. Из того, что пока не реализовал, благодаря вашим подсказкам есть понимание куда думать, но сейчас особо нету времени заниматься реализацией.
Сет вне форума  
 
Непрочитано 22.03.2016, 11:52
#22
Krieger

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


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

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


Цитата:
Большая, хорошая работа. Но зачем. Есть же выноски...
Я иногда черчу сам и пользуюсь ими с удовольствием. 2-е переработка оформления, в первом видео показано как перерабатывать оформление сделанное в другом стиле.
Я программирую давно, для меня это не очень долго, написать такой код, зато я имею инструмент под создание сложных систем класса "полная автоматизация".
Sleekka вне форума  
 
Автор темы   Непрочитано 22.03.2016, 12:03
#24
Сет


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
Ты жаловался на сложность вставки динблока и начал клики считать, хотя в моей проге на один клик меньше.
Я, видимо, что-то не так делаю, потому что kr_DrawLeader у меня не запускается, а kr_leader - это просто вставка динамического блока. В три клика же решить задачу установки выноски невозможно в принципе. Четыре клика - это минимум. Ну разве что функцию вызвать не кликом, а вводом с клавиатуры. У выноски три характерных точки, которые не могут быть получены автоматически, потому как всегда уникальны.
Сет вне форума  
 
Непрочитано 22.03.2016, 12:10
#25
Krieger

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


Цитата:
Сообщение от Сет Посмотреть сообщение
Я, видимо, что-то не так делаю, потому что kr_DrawLeader у меня не запускается
Я же говорил, не смотрел.
А как ты её запускаешь?
Цитата:
Сообщение от Сет Посмотреть сообщение
В три клика же решить задачу установки выноски невозможно в принципе. Четыре клика - это минимум. Ну разве что функцию вызвать не кликом, а вводом с клавиатуры. У выноски три характерных точки, которые не могут быть получены автоматически, потому как всегда уникальны.
Можно. Mleader ведь за два клика в экран ставится и здесь также. Длина полки зависит от длины текста.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 22.03.2016, 12:14
#26
Сет


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
А как ты её запускаешь?
1. Сохранил твой лисп.
2. Открыл твой чертеж.
3. Загрузил в него лисп.
4. Ввожу с командной строки "kr" - появляется доступная команда "kr_leader" - ее и запускаю. Это вставка дин блока.

Цитата:
Сообщение от Krieger Посмотреть сообщение
Можно. Mleader ведь за два клика в экран ставится и здесь также. Длина полки зависит от длины текста.
Длина полки зависит не от длины текста, а от желания пользователя.
Сет вне форума  
 
Непрочитано 22.03.2016, 12:21
#27
Krieger

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


Цитата:
Сообщение от Сет Посмотреть сообщение
4. Ввожу с командной строки "kr" - появляется доступная команда "kr_leader" - ее и запускаю. Это вставка дин блока.


Разве так запускают проги, нужно вот это ввести:
Код:
[Выделить все]
(kr_DrawLeader "Kr_leader" "ОбозначенияВыноски" "Точка")
Цитата:
Сообщение от Сет Посмотреть сообщение
Длина полки зависит не от длины текста, а от желания пользователя.
Да как хочешь, не принципиально.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 22.03.2016, 12:31
#28
Сет


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
Да как хочешь, не принципиально.
Ну как сказать. В процессе указания третьей точки должен быть уже нарисован отрезок между первой и второй... По поводу твоей функции - собственно все недостатки, которые я описывал ранее - справедливы и сейчас. Добавлю лишь еще один нюанс - у меня в настройках повторное выполнение команды выполняется по нажатию ПКМ. С твоей функцией этот номер не проходит.

По поводу отзеркаливания атрибутов с выравниванием... разве выравнивание отзеркаливается? Было левое, станет правым? Кажется это так не работает. В свое время делал динамический блок высотной отметки и именно по этой причине сделал четыре блока вместо одного универсального.
Сет вне форума  
 
Непрочитано 22.03.2016, 12:41
#29
Krieger

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


Цитата:
Сообщение от Сет Посмотреть сообщение
Ну как сказать. В процессе указания третьей точки должен быть уже нарисован отрезок между первой и второй...
Это можно реализовать при желании, не сложно.
Цитата:
Добавлю лишь еще один нюанс - у меня в настройках повторное выполнение команды выполняется по нажатию ПКМ. С твоей функцией этот номер не проходит.
Переделай в команду и все будет работать. У меня не было задачи сделать тебе прогу, которая бы тебя удовлетворяла на все 100%. Я её накидал за пару минут. Это пример, можешь допилить свои хотелки.
Цитата:
Сообщение от Сет Посмотреть сообщение
По поводу отзеркаливания атрибутов с выравниванием... разве выравнивание отзеркаливается? Было левое, станет правым? Кажется это так не работает. В свое время делал динамический блок высотной отметки и именно по этой причине сделал четыре блока вместо одного универсального.
При определенной сноровке с этим можно работать.
Короче, не хочешь - не надо. Флаг в руки.
__________________
Делай хорошо, плохо само получится.
Krieger вне форума  
 
Автор темы   Непрочитано 22.03.2016, 12:51
#30
Сет


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


Цитата:
Сообщение от Krieger Посмотреть сообщение
Это можно реализовать при желании, не сложно.
Собственно в этом и вопрос был изначальный. Я и исходил из того, что это не сложно, а значит можно даже быстро набросать работающий прототип. Если же сложно, то мне бы хватило подсказки какими функциями можно достичь той или иной поставленной цели.
Вот взять ту же промежуточную линию между первой и второй точкой. Я ее рисую простым отрезком, который удаляю после указания третьей точки и рисую полилинию по трем точкам. Криво, наверное, но работает. Никто другого варианта не подсказал. Я вообще не спец в ЛИСПе и не ставлю себе целью его изучения, так как все что мне от ЛИСПа нужно - это простая выноска. По крайней мере сейчас. Согласись, что ради такой цели изучать тонны документации по языку - глупо. Мне бы было даже проще использовать ObjectArx, так как я немного программирую на С++, но там не совсем понимаю как писать Arx-приложения под автокад.

Глобально же можно считать цель достигнутой, надо только последние свои "хотелки" реализовать.
Сет вне форума  
 
Непрочитано 22.03.2016, 13:33
#31
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,118


ну тот же JIG MLeader, это уже не лисп, правда.


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


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
ну тот же JIG MLeader
А что такое JIG MLeader?
Сет вне форума  
 
Непрочитано 22.03.2016, 14:58
#33
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,118


NET API / OjectARX. В поиск забейте - ссылок предостаточно с примерами кодов
Сергей812 вне форума  
 
Непрочитано 22.03.2016, 15:28
#34
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


Цитата:
Сообщение от Сет Посмотреть сообщение
Я вижу следующие недостатки мультивыноски, по крайней мере для моих задач:
1. У меня часто в одном чертеже используются выноски с точкой и без точки. Это, если хотите, мой собственный стандарт оформления, согласно которого выноска от тонкого элемента идет без точки, а от широкого - с точкой. Если работать с мультивыноской, то нужно будет создать два стиля и часто их переключать, либо менять стиль мультивыносок в свойствах. Пусть это и не выглядит критическим, но, думается, будет не слишком удобным.
2. Полка выноски всегда имеет правое положение, хотя левое положение используется у меня также часто.
3. Длина полки выноски неконтролируемая "на лету".
4. Раньше, при тестировании мультивыносок, я сталкивался с тем, что текст на ней размещается некорректно. Какой-то с отступом от полки, какой-то чуть ли не вплотную. У вашей мультивыноски при беглом тестировании я этой проблемы не обнаружил, но я не помню какие именно символы нарушали стройную геометрию. Надо потестировать еще.
1. Поставить эту точку - не проблема. Необязательно делать два стиля - можно назначить или убрать точку конкретной мультивыноске. Причем программно, по запросу при вставке.
2. Почему же? Она может иметь любое положение. Другой вопрос, как ставить по умолчанию. Но такой же вопрос возникнет и при отрисовке текста с линиями. Предполагаю, что третья точка в ТЗ - и есть указание стороны? Тогда не сложно сделать такой запрос и для выноски и ставить ее с той стороны, куда укажет пользователь.
3. Ну да, она контролируется автоматически в зависимости от ширины текста. А надо по-другому? Чтоб полка была короче или длиннее? Короче - не сделать, а длиннее можно - регулируется отступом от полки.
4. Это известная проблема с известным решением, не требующим дополнительных кликов. Ссылку я приводил выше.
Другими словами, проблем, кажется, не осталось.
Я прекрасно понимаю это желание сделать СВОЙ инструмент и задор, подстегиваемый интересом к лиспу, - и разделяю их. И, возможно, ничего плохого нет в таком решении создать "свою выноску", кроме одного, что мне очень не нравится: редактировать впоследствии такие "расчлененные" выноски. Раз уж пошла пьянка считать клики, то и я свой расчет приведу. Для перемещения выноски, состоящей из линий и текста, нужно 8 кликов (один из них - вызов команды переноса - тянемся из области чертежа к кнопке на панели), а для перемещения мультивыноски - три клика. А при создании в обоих вариантов кликов одинаково. При этом - разница в количестве обработок, неожиданностей и затраченного времени может быть колоссальной. Или есть полная уверенность в том, что будучи раз созданной, выноска ни при каких обстоятельствах больше никуда не будет смещаться? Если так - тогда смело доделывайте свою команду, раз в кайф, но я уверен, можно найти немало более интересных и полезных задач для прикладного программирования.
skkkk вне форума  
 
Автор темы   Непрочитано 22.03.2016, 15:44
#35
Сет


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Предполагаю, что третья точка в ТЗ - и есть указание стороны?
Именно так. Но не только. Третья точка указывает где заканчивается полка.

Цитата:
Сообщение от skkkk Посмотреть сообщение
Ну да, она контролируется автоматически в зависимости от ширины текста. А надо по-другому? Чтоб полка была короче или длиннее? Короче - не сделать, а длиннее можно - регулируется отступом от полки.
Да, надо по другому. Длина полки определяется пользователем, путем указания третьей точки. У меня этот функционал уже реализован, посмотри мой лисп выше.

Цитата:
Сообщение от skkkk Посмотреть сообщение
Другими словами, проблем, кажется, не осталось.
Ну это на словах. Я не знаю как подправить твой лисп до того функционала, который мне нужен. Смотрю тот код и вижу много непонятного. Единственный плюс, по сравнению с тем, что получается у меня - это выноска как единый объект. Плюс значимый, вопросов нет. Но и сложность реализации, кажется, увеличивается. Есть ли резон в это глубоко вникать ради моей задачи? Как я ранее говорил - ЛИСП как таковой я изучать не хочу, поскольку практически применять его не планирую.
Сет вне форума  
 
Непрочитано 22.03.2016, 15:54
#36
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,118


Цитата:
Сообщение от skkkk Посмотреть сообщение
Необязательно делать два стиля - можно назначить или убрать точку конкретной мультивыноске. Причем программно, по запросу при вставке.
Два стиля - защита от "продвинутых" пользователей при ручном редактировании просто)
Сергей812 вне форума  
 
Непрочитано 22.03.2016, 18:40
#37
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


Цитата:
Сообщение от Сет Посмотреть сообщение
Именно так. Но не только. Третья точка указывает где заканчивается полка.
Ну тогда да, может, применение подобного подхода и оправданно. Любопытно, а почему и из каких соображений исходя, пользователь решает, какой длины должна быть полка? И я так понял из первого поста, что текст в выноске всегда выравнивается в сторону "от полки", на таком расстоянии, которое укажет пользователь, симметрично, а не всегда влево или всегда вправо? Я просто все еще цепляюсь за возможность найти подходящие настройки мультивыноски. Если так, то можно и спросить у пользователя точку (третью) и рассчитав величину отступа от полки, построить выноску. Почти уверен, что можно добиться нужных настроек выноски или стиля.

Цитата:
Сообщение от Сет Посмотреть сообщение
посмотри мой лисп выше.
Почему-то даже после создания слоя "000-Серый" и стиля "Шрифт 10" текст у меня так и не появился. Только две линии. И запроса на вторую строку не увидел. Поэтому и не могу понять, как должно быть. А погружаться глубоко время не позволяет.

Цитата:
Сообщение от Сергей812 Посмотреть сообщение
5 - JIG реализовывается
Думаю, это лишнее, Сет хочет видеть только выносные линии:

Цитата:
Сообщение от Сет Посмотреть сообщение
5. В процессе задания точек хотелось бы видеть промежуточные сегменты, как это видно при отрисовке, например, полилинии. Промежуточная отрисовка текста - не важна.
Цитата:
Сообщение от Сет Посмотреть сообщение
Я не знаю как подправить твой лисп до того функционала, который мне нужен. Смотрю тот код и вижу много непонятного.
Ну так форум и нужен для того, чтобы узнать. Тут много добрых людей, которые с удовольствием помогут заинтересованному "ученику". Но делать "медвежью услугу" никто не хочет. Что именно непонятно? Как убрать запрос второй строки в действия по правой кнопке при запросе точки?
Цитата:
Сообщение от Сет Посмотреть сообщение
Единственный плюс, по сравнению с тем, что получается у меня - это выноска как единый объект.
... который очень жирный и перечеркивает все минусы, особенно учитывая то, что их все (ну в крайнем случае, почти) можно "пофиксить" и "отдебажить". На данный момент я пока не вижу нереализуемых вещей. Запустить бы, конечно, код, многое бы стало ясно, наверное... Ну и файл, на котором использовать этот пример очень желателен. С тем, как что должно получиться и всеми возможными вариантами выносок. А то говорим, похоже, о разном временами.

----- добавлено через ~4 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Два стиля - защита от "продвинутых" пользователей при ручном редактировании просто)
Не пойму, как это может защитить от них? Как от них вообще может что-то защитить?

----- добавлено через ~24 мин. -----
Цитата:
Сообщение от Сергей812 Посмотреть сообщение
5 - JIG реализовывается
Сергей 812, сейчас вот я еще подумал, что с JIG'ом тут как раз можно было бы попробовать избежать третьего клика, но вспомнил, что все равно нужно ширину полки указывать на усмотрение пользователя. Если выносная линия строго ортогональна (даже по замыслу принудительно), то, думаю, выноску можно было бы вставлять с той стороны, в которую отклонится мышка от вертикали при указании второй точки. Кстати, можно и без JIG'а, по-моему, так сделать, но с ним - лучше. Однако, третьего клика судя по задумке автора, не избежать никак.
skkkk вне форума  
 
Автор темы   Непрочитано 22.03.2016, 19:25
#38
Сет


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Любопытно, а почему и из каких соображений исходя, пользователь решает, какой длины должна быть полка?
Из соображений удобства размещения на чертеже. Например если рядом с вертикальной выносной линией находятся какие-то другие объекты и нужно полку выноски оттянуть подальше, чтобы разместить ее текст.

Цитата:
Сообщение от skkkk Посмотреть сообщение
И я так понял из первого поста, что текст в выноске всегда выравнивается в сторону "от полки", на таком расстоянии, которое укажет пользователь, симметрично, а не всегда влево или всегда вправо?
Тут все просто. Если полка слева, то текст выравнивается по ее левому краю. Если справа - то, соответственно, по правому.

Цитата:
Сообщение от skkkk Посмотреть сообщение
Почему-то даже после создания слоя "000-Серый" и стиля "Шрифт 10" текст у меня так и не появился. Только две линии. И запроса на вторую строку не увидел.
Так а ты текст верхней строки ввел? Если да, то я не знаю почему он не отобразился. А нижнюю строку я пока не делал, потому как хочу, чтобы она была опциональной.

Цитата:
Сообщение от skkkk Посмотреть сообщение
Тут много добрых людей, которые с удовольствием помогут заинтересованному "ученику". Но делать "медвежью услугу" никто не хочет. Что именно непонятно? Как убрать запрос второй строки в действия по правой кнопке при запросе точки?
Я предлагаю пойти по-другому пути. Сначала сделать выноску отдельными примитивами с учетом всех моих "хотелок", а потом, видя конечный результат, ты посмотришь насколько сложно это будет сделать с мультивыноской. Так-то я тоже предпочел бы именно мультивыноску (если проблема с отступом текста от полки действительно решена), но чувствую, что возиться с ней буду долго.

Что касается выноски с простыми примитивами, то я думаю, что близок к ее завершению. Текущий вопрос, на который пока не нахожу ответа, это как реализуются встроенные параметры в запрос функции, как это сделано, например, в штатной команде ПРЯМОУГОЛЬНИК. Параметры Фаска Уровень и т.д. кликабельны и позволяют задать дополнительные параметры. Я бы хотел используя эту же механику добавлять нижний текст и точку.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 27
Размер:	4.2 Кб
ID:	167335  
Сет вне форума  
 
Непрочитано 22.03.2016, 19:26
#39
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,118


Цитата:
Сообщение от skkkk Посмотреть сообщение
Сергей 812, сейчас вот я еще подумал, что с JIG'ом тут как раз можно было бы попробовать избежать третьего клика, но вспомнил, что все равно нужно ширину полки указывать на усмотрение пользователя. Если выносная линия строго ортогональна (даже по замыслу принудительно), то, думаю, выноску можно было бы вставлять с той стороны, в которую отклонится мышка от вертикали при указании второй точки. Кстати, можно и без JIG'а, по-моему, так сделать, но с ним - лучше. Однако, третьего клика судя по задумке автора, не избежать никак.
сейчас лишь первый этап-техническая реализация. А когда это решение будет опробовано на большом объеме работы - автор ТС зря надеется, что ему не придется углубляться, имхо)

----- добавлено через ~1 мин. -----
Цитата:
Сообщение от Сет Посмотреть сообщение
Текущий вопрос, на который пока не нахожу ответа, это как реализуются встроенные параметры в запрос функции, как это сделано, например, в штатной команде ПРЯМОУГОЛЬНИК. Параметры Фаска Уровень и т.д. кликабельны и позволяют задать дополнительные параметры. Я бы хотел используя эту же механику добавлять нижний текст и точку.
Это и есть ключевые слова
Сергей812 вне форума  
 
Автор темы   Непрочитано 22.03.2016, 19:36
#40
Сет


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Это и есть ключевые слова
А можно пример синтаксиса?
Сет вне форума  
 
Непрочитано 22.03.2016, 19:44
1 | #41
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,118


функция лиспа initget, насколько помню

----- добавлено через ~11 мин. -----
Например
Код:
[Выделить все]
 (defun c:Test( / lVar)
  (initget 128 "Point BottomText")
  (setq lVar (getpoint "\Выберите точку: [Point/BottomText]"))
)

Последний раз редактировалось Сергей812, 22.03.2016 в 20:38.
Сергей812 вне форума  
 
Автор темы   Непрочитано 22.03.2016, 20:05
#42
Сет


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
функция лиспа initget
Но она как-то не так работает. В команде Прямоугольник клик на ключевое слово активирует что-то вроде подфункции - идет новый запрос. Здесь же клик на ключевое слово - это вариант ответа на текущий запрос.

----- добавлено через ~11 мин. -----
Или как раз определенный ответ на текущий запрос и запускает подпрограмму через что типа (if (= 1Var "P") ... ) ?
Сет вне форума  
 
Непрочитано 22.03.2016, 20:16
#43
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,118


логично потому что после функции запроса данных у пользователя getXXX должна идти обработка результатов, что пользователь вернул - координаты точки или ключевое слово.. что в лиспе, что в том же NetApi.. и на основании анализа возвращенного значения запускается тот или иной кусок кода..
Сергей812 вне форума  
 
Непрочитано 22.03.2016, 22:46
1 | #44
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


Код:
[Выделить все]
 (initget 128 "Раз Два Три") ;;; задаем возможные значения ключевых слов
(setq pt (getpoint "\nУкажите точку или [Раз/Два/Три] <Раз>")) ;;; в квадратных скобках через слэш перечисляем варианты после приглашения
(if (null pt) (setq pt "Раз")) ;;; назначаем значение, если нажата правая кнопка мыши (значение по умолчанию)
;;;далее обработка значений:
(cond ;;;задаем условия
  (	(= pt "Раз") ;;; если pt = Раз,
	(princ "\nРаз") ;;; то что-то делаем
	(princ "\nСюда еще можно что-то добавить")
  )
  (	(= pt "Два")
	(princ "\nДва")
  )
;;;и так далее
)
skkkk вне форума  
 
Автор темы   Непрочитано 22.03.2016, 23:03
#45
Сет


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


skkkk, я доделал выноску с практически всеми реализованными "хотелками". Осталось несколько нюансов некритичных для понимания того результата, которого я хочу добиться. Во вложении тестовый чертеж и лисп - посмотри, можно ли такой функционал реализовать через мультивыноски по-простому

Из нереализованных "хотелок":
1. Автовключение режима ОРТО после указания первой точки выноски и возврат к исходному состоянию после отрисовки выноски (вроде понятно как делать, просто надо уделить время).
2. В качестве точки я рисую круг, а надо бы кольцо с внутренним диаметром 0 (не нашел в методах ActiveX функции типа AddDonut - нужна помощь).
3. При отрисовке выноски с текстом снизу и сверху хотелось бы, чтобы строка большего размера выравнивалась по краю полки, а строка меньшего размера - по центру строки большего размера (это не знаю как сделать, полагаю что сложно, потому готов смириться с тем, что есть сейчас - выравнивание верхнего и нижнего текста по краю полки).
Вложения
Тип файла: dwg
DWG 2004
MyLeader.dwg (135.9 Кб, 27 просмотров)
Тип файла: lsp MyLeader.lsp (5.2 Кб, 50 просмотров)
Сет вне форума  
 
Непрочитано 22.03.2016, 23:07
#46
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от Сет Посмотреть сообщение
Автовключение режима ОРТО после указания первой точки выноски и возврат к исходному состоянию после отрисовки выноски (вроде понятно как делать, просто надо уделить время).
Системная переменная orthomode
Цитата:
Сообщение от Сет Посмотреть сообщение
В качестве точки я рисую круг, а надо бы кольцо с внутренним диаметром 0 (не нашел в методах ActiveX функции типа AddDonut - нужна помощь).
Ее нет. donut - замкнутая полилиния из 2 сегментов с 2 вершинами и предустановленной шириной сегмента. Так что добавляй полилинию и устанавливай все соответствующие параметры. Кстати, vla-addrectangle тоже не существует.

P.S. Код не смотрел и не анализировал.
__________________

---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 23.03.2016, 02:01
1 | #47
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
сейчас лишь первый этап-техническая реализация. А когда это решение будет опробовано на большом объеме работы - автор ТС зря надеется, что ему не придется углубляться, имхо)
Согласен. Дальше - больше.
Цитата:
Сообщение от Сет Посмотреть сообщение
skkkk, я доделал выноску с практически всеми реализованными "хотелками". Осталось несколько нюансов некритичных для понимания того результата, которого я хочу добиться.
Знаю это приятное чувство, когда теперь тебе для какой-то рутинной операции нужно сделать в три раза меньше кликов, чем раньше. И эти "в три раза" умножаются тысячекратно, ежедневно прибавляя. И вообще блаженство, когда ты сделал эту программу сам.
Цитата:
Сообщение от Сет Посмотреть сообщение
Во вложении тестовый чертеж и лисп - посмотри, можно ли такой функционал реализовать через мультивыноски по-простому
Посмотрел, все запустилось, выноска построилась, беглое тестирование ошибок не выявило. Можно через мультивыноски реализовать такое. Не знаю, как насчет по-простому программно, но думаю, что не особо по-сложному. Кстати, в моем вложении выноска уже настроена была почти так, как надо. Сейчас прикладываю файл с выноской, которая чуть подправлена с учетом третьей "хотелки" - сделал выравнивание по центру и добавил величину полки = 100. В выноске появились две дополнительные треугольные ручки, от которых я в свое время с радостью избавился, но, кажется, в случае с вертикальной выносной линией они будут удобны. Попробуй.

Чтобы код работал в любом файле, алгоритм я вижу примерно таким:
1. Создать слой (если нет в чертеже). Решения на форуме есть.
2. Создать стиль текста, стиль мультивыноски (если нет в чертеже). Коды уже также на форуме имеются, надо найти, разобраться с нужными настройками стиля и прописать их в коде - заточить под себя.
3. Ввод текста, указание первой, второй, третьей точки - все как ты уже реализовал. Между вводом первой и второй точки включить режим ОРТО. В принципе, твой код почти целиком можно взять за основу, только не создавать тексты, а создать полилинии, как временные примитивы для визуализации отрисовки выносной линии и полки, затем сразу удалить их. Потом на основе введенных данных рассчитать все необходимые параметры мультивыноски, и создать ее программно, при помощи кода VVA из приведенной мною ранее ссылки. Хотя, может, тексты придется и создать в том же стиле для определения их габаритов (см. ниже).
4. Назначить созданной мультивыноске "правильный" межстрочный интервал для устранения проблемы прилипания к полке при помощи другого кода VVA (ссылку я тоже приводил). Там в коде также предусмотрена возможность автоматического преобразования создаваемых мультивыносок с использованием реактора.
5. Назначить мультивыноске другие необходимые свойства, вычисленные перед отрисовкой: отступ от полки и/или величина полки, положение текста относительно выносной линии (справа-слева), слой, блок-круг на конце или нет (кстати, отпадает необходимость возиться с "хотелкой" №2) и прочее - явно не все вспомнил. Самое трудное и муторное тут на мой взгляд - это вычисление отступа от полки (и/или величины полки) в зависимости от указанной третьей точки - похоже, нужно будет вычислять ширину текста через его boundingbox и сравнивать ее с длиной отрезка между второй и третьей точками, а разницу назначать параметру "величина полки" или "отступ от полки" - в зависимости от того, понравятся ли треугольные ручки (лень искать имена свойств ActiveX - их можно узнать, сняв с мультивыноски дамп и, если надо, заглянув в англо-русский словарь).
6. Добавить обработчик ошибок (см. *error*, например в теме "Научите лиспу..."), чтобы при выходе из программы по Esc восстанавливать значения переменных и удалять временные примитивы.

Таким образом, пожалуй, всю эту работу ты проделал не зря. Во-первых уже с пользой для производства, - но останавливаться рано. А во-вторых, как оказалось, с заделом на развитие и с минимумом лишних движений. Осталось теперь создать мультивыноску, являющуюся точной копией этих временных примитивов. Коды для всех этих задач точно видел в Сети, надо найти, "подпилить", рассчитать смещение текста и все это объединить.
Удачи в этом увлекательном деле .
Offtop: Посмотрим, как оно будет: только ли эту задачку захочешь решить?
Вложения
Тип файла: dwg
DWG 2010
MyLeader.dwg (155.1 Кб, 22 просмотров)

Последний раз редактировалось skkkk, 23.03.2016 в 02:17.
skkkk вне форума  
 
Автор темы   Непрочитано 23.03.2016, 08:47
#48
Сет


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Знаю это приятное чувство, когда теперь тебе для какой-то рутинной операции нужно сделать в три раза меньше кликов, чем раньше. И эти "в три раза" умножаются тысячекратно, ежедневно прибавляя. И вообще блаженство, когда ты сделал эту программу сам.
Я немного программирую на С++, поэтому чувство подчинения компьютера своей воле изведано давно

Цитата:
Сообщение от skkkk Посмотреть сообщение
Сейчас прикладываю файл с выноской, которая чуть подправлена с учетом третьей "хотелки" - сделал выравнивание по центру и добавил величину полки = 100. В выноске появились две дополнительные треугольные ручки, от которых я в свое время с радостью избавился, но, кажется, в случае с вертикальной выносной линией они будут удобны. Попробуй.
Я не понял, ты просто нарисовал мультивыноску и настроил ее свойства, чтобы она выглядела как у меня? Ну я не сомневался, что это возможно. Вся суть в программной реализации. В принципе действительно основу я создал и все что остается - это нарисовать мультивыноску и задать ей нужные свойства... Попробую как время будет.

Цитата:
Сообщение от skkkk Посмотреть сообщение
похоже, нужно будет вычислять ширину текста через его boundingbox
А можно пример использования этой функции?
Вообще говоря было бы неплохо расширить функционал моей выноски следующим образом. Если я указываю третью точку кликом на экране - это точка становится концом полки. Если же я в ответ на запрос третьей точки жму Enter - полка рисуется автоматически по длине текста. При этом положение полки (слева или справа) определяется текущим положением курсора относительно второй точки. Это возможно?
Сет вне форума  
 
Непрочитано 23.03.2016, 11:14
1 | #49
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


Цитата:
Сообщение от Сет Посмотреть сообщение
Я немного программирую на С++
А почему тогда теперь LISP? Это не шаг назад?

Цитата:
Сообщение от Сет Посмотреть сообщение
Я не понял, ты просто нарисовал мультивыноску и настроил ее свойства, чтобы она выглядела как у меня?
Именно, причем сделал я это для того, чтоб ты сравнил, какая из настроенных выносок тебе более подойдет - эта или та, что я прикладывал ранее? Разница в появлении треугольных ручек. Попробуй. Программно это сделать реально.
Цитата:
Сообщение от Сет Посмотреть сообщение
А можно пример использования этой функции?
Можно. Там после выполнения кода в переменные 'minp 'maxp заносятся координаты левого нижнего и правого верхнего углов прямоугольника, ограничивающего объект. Координаты записываются в виде массива, затем функцией vlax-safearray->list преобразовываются в привычный вид.

Цитата:
Сообщение от Сет Посмотреть сообщение
Если я указываю третью точку кликом на экране - это точка становится концом полки.
Это уже есть.
Цитата:
Сообщение от Сет Посмотреть сообщение
Если же я в ответ на запрос третьей точки жму Enter - полка рисуется автоматически по длине текста.
Тут уже можно просто программно создать выноску указанием двух точек, функцией VVA.
Третья точка для этой выноски пока не нужна, она нужна только для определения стороны, в которую будет повернута выноска.
Цитата:
Сообщение от Сет Посмотреть сообщение
При этом положение полки (слева или справа) определяется текущим положением курсора относительно второй точки. Это возможно?
Определить текущее положение курсора (см. функцию grread):
Код:
[Выделить все]
 (setq temp_point (getpoint p2 "\nУкажите третью точку [НижнийТекст/Точка]:")) ;;; запрашиваем точку как обычно
(if (null temp_point) ;;; если после указания точка не задана, т.е., нажата правая кнопка или Enter (пустой ввод)
	(progn
		(setq pt (cadr (grread T))) ;;;  в переменной pt запомнится точка, в которой был курсор при нажатии правой кнопки
		;;; ...................
	)
)
Далее надо пораскинуть мозгами. Либо рисовать выноску сначала в той точке, которая у нас сохранилась здесь в переменной pt - так она точно встанет в ту сторону, а затем программно "подвинуть" точку излома полки над первой точкой. Либо посмотреть тут и после отрисовки принудительно поворачивать выноску в сторону, где был правый клик.
skkkk вне форума  
 
Автор темы   Непрочитано 23.03.2016, 11:31
#50
Сет


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
А почему тогда теперь LISP? Это не шаг назад?
Врядли. Во-первых я не совсем понимаю как писать arx-приложения для автокад, нужно изучать вопрос. Во-вторых, насколько я понимаю ObjectArx сложнее чем ЛИСП. Погружаться в ObjectArx ради простой выноски... разумно ли это? Это все равно как потратить 5 лет на обучение в медуниверситете, чтобы подобрать себе таблетку от головной боли


Цитата:
Сообщение от skkkk Посмотреть сообщение
Разница в появлении треугольных ручек
Я наблюдаю только одну треугольную ручку - она изменяет отступ от выносной линии до полки, фактически меняет длину полки. Без этой ручки длину полки же никак не изменить?Если так, то я считаю эта ручка однозначно нужна.

Цитата:
Сообщение от skkkk Посмотреть сообщение
Тут уже можно просто программно создать выноску указанием двух точек
Собственно это и подразумевал. Далеко не всегда есть необходимость делать длинную полку выноски. Порой достаточно автоширины. Тогда выноска строится в два клика и курсором указываем направление полки. Если есть функции, отслеживающие положение курсора, - тогда все замечательно.
Сет вне форума  
 
Непрочитано 23.03.2016, 11:58
#51
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


Цитата:
Сообщение от Сет Посмотреть сообщение
Я наблюдаю только одну треугольную ручку - она изменяет отступ от выносной линии до полки, фактически меняет длину полки. Без этой ручки длину полки же никак не изменить?Если так, то я считаю эта ручка однозначно нужна.
Странно. У меня две. См. вложение. Длину полки без ручки можно менять еще отступом от полки, но только через панель свойств или программно. По месту, в отдельно взятой выноске, длину полки можно регулировать только этой ручкой. Думаю, ручных корректировок положения полки не избежать, поэтому треугольные ручки я бы оставил в данном случае. Я просто пользуюсь выноскам таким образом, что выносная линия у них всегда под углом к вертикали, и ширина полки у меня зависит исключительно от размеров текста, поэтому их убрал - мешались.
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 31
Размер:	20.6 Кб
ID:	167366  
skkkk вне форума  
 
Автор темы   Непрочитано 23.03.2016, 12:37
#52
Сет


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Странно. У меня две.
Левая ручка полку отзеркаливает? Это тоже было бы полезно.

У меня выноска выглядит так.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 22
Размер:	8.2 Кб
ID:	167370  
Сет вне форума  
 
Непрочитано 23.03.2016, 13:14
#53
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


Видимо, Автокад поновее. У меня 2011. Левая ручка, к сожалению, выноску не зеркалит - вообще не понимаю ее назначения. А поскольку не зеркалит - без нее гораздо удобнее. Квадратная ручка должна быть на изломе - это логично. Разработчики это поняли. А отзеркаливание выноски можно настроить на двойной клик по выносной линии (см. Операции при двукратном нажатии в Адаптации). При этом двойной клик на тексте мультивыноски также будет вызывать редактор.
skkkk вне форума  
 
Автор темы   Непрочитано 23.03.2016, 13:22
#54
Сет


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Видимо, Автокад поновее. У меня 2011.
У меня 2016.
Сет вне форума  
 
Непрочитано 23.03.2016, 13:51
1 | #55
Alan

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Видимо, Автокад поновее. У меня 2011. Левая ручка, к сожалению, выноску не зеркалит - вообще не понимаю ее назначения.
Вот чем хорош ЛИСП, что не надо учитывать версию Автокада.
У меня ЛИСП "простой выноски" работает еще с ДОС-версии
Попутно в "Похожие темы" увидел дискуссию 2009 года http://forum.dwg.ru/showthread.php?t=40090
>Сет
В ней кстати разбираются ошибки ЛИСП"а, которые есть в твоём тексте
__________________
По теории майский жук летать не может.
Но он этого не знает. И летает...
Alan вне форума  
 
Непрочитано 23.03.2016, 17:08
#56
Sleekka

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


Цитата:
Сообщение от skkkk Посмотреть сообщение
А почему тогда теперь LISP? Это не шаг назад?
http://konspekta.net/studopediaorg/b...s/image256.jpg

Нет, это не шаг назад, это переход в другое измерение.
Sleekka вне форума  
 
Непрочитано 23.03.2016, 18:02
#57
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


Offtop: Sleekka, проблемно-ориентированные языки - это у них проблемы с ориентацией, или они ориентированы на решение проблем, или проблемы с определением их ориентации?
skkkk вне форума  
 
Непрочитано 24.03.2016, 08:40
#58
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,118


Просто разные области применения у LISP и NET/ObjectARX - если нужен голый функционал, то на лиспе (если им владеешь в достаточной степени) зачастую будет написать проще. Если нужны развитые средства интерфейса, поддержка работы с БД, с XML и т.д. -то проще уже перейти на ООП, где это все реализовано. И сосредоточить усилия именно на практическую реализацию своих хотелок) Благо информации по тому же NET API за последние несколько лет стало гораздо больше, в том числе и на русском языке.

Цитата:
Сообщение от Сет Посмотреть сообщение
Врядли. Во-первых я не совсем понимаю как писать arx-приложения для автокад, нужно изучать вопрос. Во-вторых, насколько я понимаю ObjectArx сложнее чем ЛИСП. Погружаться в ObjectArx ради простой выноски... разумно ли это? Это все равно как потратить 5 лет на обучение в медуниверситете, чтобы подобрать себе таблетку от головной боли
Обычно этим не ограничивается.. потом появляется желание, чтобы данные сами подставлялись, синхронизировались с тем же Excel и т.д.-есть умельцы, что делают это на лиспе, ну это уже маэстро с многолетним опытом.
Сергей812 вне форума  
 
Автор темы   Непрочитано 27.03.2016, 14:27
#59
Сет


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Далее надо пораскинуть мозгами. Либо рисовать выноску сначала в той точке, которая у нас сохранилась здесь в переменной pt - так она точно встанет в ту сторону, а затем программно "подвинуть" точку излома полки над первой точкой. Либо посмотреть тут и после отрисовки принудительно поворачивать выноску в сторону, где был правый клик.
Что-то никак не пойму - как заставить полку рисоваться слева (выносная линия вертикальная)? Какое свойство мультивыноски за это в ответе? Программно двигать точку излома влево - не вариант.
Сет вне форума  
 
Непрочитано 27.03.2016, 16:38
#60
VVA

Инженер LISP
 
Регистрация: 11.05.2005
Минск
Сообщений: 6,809
<phrase 1= Отправить сообщение для VVA с помощью Skype™


Цитата:
Сообщение от Сет Посмотреть сообщение
Что-то никак не пойму - как заставить полку рисоваться слева (выносная линия вертикальная)?
Сделай ее "псевдовертикальной". Сделай отступ по Х в нужную (в данном случае влево) для тебя сторону на несущественное для тебя значение (например на 0.001). Этим ты "покажешь" мультивыноске желаемую сторону отрисовки полки
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 27.03.2016, 17:25
#61
Сет


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Сделай ее "псевдовертикальной". Сделай отступ по Х в нужную (в данном случае влево) для тебя сторону на несущественное для тебя значение (например на 0.001).
То есть ты имеешь ввиду фактически линию сделать наклонной? Хотелось бы, чтобы геометрия вертикальной линии была идеальной, т.е. без сдвигов даже на 0.001.
Сет вне форума  
 
Непрочитано 27.03.2016, 17:55
#62
Сергей812


 
Регистрация: 10.08.2013
Сообщений: 7,118


Пишите свой вариант выноски тогда

----- добавлено через ~2 мин. -----
если нужен узкоспециализированный вариант с идеально-вертикальной линией - тогда тот же динблок
Сергей812 вне форума  
 
Автор темы   Непрочитано 27.03.2016, 18:14
#63
Сет


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


Цитата:
Сообщение от Сергей812 Посмотреть сообщение
Пишите свой вариант выноски тогда
Я бы написал, если бы понимал как заставить полку рисоваться слева от последней точки выноски.

Попутно возник еще один вопрос. Я реализую указание параметров выноски через диалоговое окно. Сначала использовал в качестве кнопок выхода из диалога стандартную пару ok_cancel. Но эти кнопки разной ширины, захотел немного подравнять это дело. Пишу такой код вместо ok_cancel:
Код:
[Выделить все]
 : row { 
    : button {label="OK"; key="accept"; action="(done_dialog)";}
    : button {label="Отмена"; key="cancel";}} 
Но в таком виде диалог просто не отображается. Автокад выдает сообщение, что у диалога нет кнопок OK или Cancel. То есть как бы однажды появившись этот диалог не может быть закрыт.
Сет вне форума  
 
Непрочитано 27.03.2016, 18:19
1 | #64
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,073


не знаю как это делается на лисп, но в C# направление выноски устанавливается как то так:
Код:
[Выделить все]
 
 // Вот сюда запихнуть правую-левую привязку текста
if (mLandingLocation.X < mArrowLocation.X)
{
  Entity.SetDogleg(0, new Vector3d(-1, 0, 0));
}else{
  Entity.SetDogleg(0, new Vector3d(1, 0, 0));
}
Entity - MLeader
mLandingLocation - положение текста
mArrowLocation - положение указателя

Возможно вам это поможет.
__________________
_бложиг
Boxa вне форума  
 
Автор темы   Непрочитано 27.03.2016, 18:46
#65
Сет


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


Я уже пытался с этими Dogleg'ами что-то сделать - ничего путного не получается, да и смысл этого свойства не очень понятен. Я задаю это свойство в двух вариантах:
Код:
[Выделить все]
 (vla-SetDoglegDirection mleader 0 (vlax-3D-point '(1 0 0)))
(vla-SetDoglegDirection mleader 0 (vlax-3D-point '(-1 0 0)))
В первом случае выносная линия отклоняется от вертикали, смещаясь влево, полка находится справа.
Во втором случае выносная линия отклоняется от вертикали вправо, полка находится слева.

----- добавлено через ~13 мин. -----
По второму варианту верх выносной линии уходит вправо визуально на ширину мультитекста. С помощью ручки выносную линию можно вернуть в вертикальное положение, при этом полка остается слева, как мне и нужно. Вопрос - каким образом получить доступ к этой точке мультивыноски, чтобы переместить ее программно?
Сет вне форума  
 
Автор темы   Непрочитано 27.03.2016, 19:02
#66
Сет


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


Для лучшего понимания добавлю картинку. Первая выноска - это при вставке. Вторая - вручную отредактированная с помощью ручки (та, которая в красном кружке). Вот ее-то и нужно программно сдвинуть.

----- добавлено через ~3 ч. -----
Цитата:
Сообщение от VVA Посмотреть сообщение
Сделай отступ по Х в нужную (в данном случае влево) для тебя сторону на несущественное для тебя значение (например на 0.001).
Я попробовал этот способ - он не работает. Смещал точку даже на 1000 влево - все равно полка рисуется справа.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 20
Размер:	5.1 Кб
ID:	167628  
Сет вне форума  
 
Непрочитано 27.03.2016, 22:01
#67
skkkk

AutoCAD_2008->2011
 
Регистрация: 20.03.2008
Московская область
Сообщений: 2,295


Сет, а если ее отзеркалить?
skkkk вне форума  
 
Автор темы   Непрочитано 27.03.2016, 22:09
#68
Сет


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Сет, а если ее отзеркалить?
Была такая мысль, но отзеркаливание годится только для простых выносок, как на картинке. Если же выноска многосегментная (я усложнил себе задачу), то отзеркаливание не годится, так как отзеркалится вся геометрия сложной выноски.

Сейчас размышляю над двумя возможностями.

1. Использовать как-то SetLeaderLineVertices, но пока ничего дельного не выходит.
2. Выяснить координаты последней точки выноски (которая автоматически смещается, она в красном кружке на картинке) через GetLeaderLineVertices и с помощью команды РАСТЯНУТЬ сдвинуть ее на необходимую величину влево. Во всяком случае вручную этот способ работает, но как это сделать программно - пока не понимаю.

----- добавлено через ~24 мин. -----
Кажется разобрался с первым способом. работает вот такая конструкция:
Код:
[Выделить все]
 (vla-SetLeaderLineVertices mleader 0 mleader_points)
mleader - vla-объект мультивыноска
0 - индекс выносной линии (у меня предусмотрена всего одна выносная линия, значит 0)
mleader_points - массив safearray из вариантов с типа vbDouble с координатами вершин мультивыноски
Сет вне форума  
 
Автор темы   Непрочитано 27.03.2016, 23:38
#69
Сет


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


Ну что ж, вот что у меня получилось.

Код:
[Выделить все]
 cs_leader_dialog: dialog
{
  label="Выноска";
  initial_focus="k_top_text"; 
  : row
  {
    : edit_box {key="k_top_text"; width=30;}
    : text {label="Верхний текст";}
  }
  : row
  {
    : edit_box {key="k_bottom_text"; width=29;}
    : text {label="Нижний текст";}
  }
  : row
  {
    : popup_list {key="k_layer"; width=20;}
    : text {label="Слои";}
  }
  : row
  {
    height=2;
    : toggle {alignment="bottom"; label="Рисовать точку"; key="k_dot"; value="0";}
  }   
  ok_cancel; 
}


Код:
[Выделить все]
 (vl-load-com)
(setq acad_application (vlax-get-acad-object))
(setq active_document (vla-get-ActiveDocument acad_application))
(setq model_space (vla-get-ModelSpace active_document))

(setq default_top_text "")
(setq default_bottom_text "")
(setq default_layer "")
(setq default_draw_dot "0")

(defun c:cs_leader (/ dcl_id
		      layers
		      count_layers
		      active_layer
		      layer
		      i
		      p1		     
		      p2
		      points
		      count_points
		      enter_point
		      polyline
		      polyline_points
		      mleader
		      mleader_points
		      p_left
		      p_right
		      polka_length
		      text_length)
  (setq dcl_id (load_dialog "D:\\MyAutoCAD\\cs_leader.dcl"))
  (new_dialog "cs_leader_dialog" dcl_id)
  (set_tile "k_top_text" default_top_text)
  (set_tile "k_bottom_text" default_bottom_text)
  (set_tile "k_dot" default_draw_dot)
  ;;; заполнение списка слоев
  (start_list "k_layer")
  (setq layers (vla-get-Layers active_document))
  (setq count_layers (vla-get-Count layers))
  (setq active_layer -1)
  (setq i 0)
  (repeat count_layers
    (setq layer (vla-get-Name (vla-Item layers i)))
    (if (= layer default_layer) (setq active_layer i))	  
    (add_list layer)
    (setq i (1+ i))
  ) ; repeat
  (end_list)
  (if (>= active_layer 0) (set_tile "k_layer" (itoa active_layer)))
  ;;; конец заполнения списка слоев
  (action_tile "k_top_text" "(setq default_top_text $value)")
  (action_tile "k_bottom_text" "(setq default_bottom_text $value)")
  (action_tile "k_dot" "(setq default_draw_dot $value)")
  (action_tile "accept" "(setq default_layer (vla-get-Name (vla-Item layers (atoi (get_tile \"k_layer\")))))
                         (done_dialog)")
  (action_tile "cancel" "(exit)") 
  (start_dialog)
  (unload_dialog dcl_id)
  (setq p1 (getpoint "\nУкажите точку выноски:"))
  (setq points p1)
  (setq enter_point 1)
  (while (= enter_point 1)
    (setq p2 (getpoint p1 "\nУкажите следующую точку:"))
    (if (null p2)
        (progn		
          (setq enter_point 0)	  
        ) ; progn
        (progn
          (setq points (append points p2))
	  (setq p1 p2)
	  (if (/= polyline nill) 
	    (if (not (vlax-erased-p polyline)) (vla-Delete polyline))
	  ); if
	  (setq polyline_points (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length points)))))
          (vlax-safearray-fill polyline_points points)
          (setq polyline (vla-AddPolyline model_space polyline_points))
	  (vla-put-Layer polyline default_layer)
        ) ; progn
    ) ; if
  ) ; while
  ;;; определяем длину полки
  (setq p2 (getpoint p1 "\nУкажите точку конца полки:"))
  (if (null p2)
    (progn		
      (setq p2 (cadr (grread T)))
    ) ; progn
    (progn		
      (setq polka_length (abs (- (car p1) (car p2))))
    ) ; progn
  ) ; if
  
  ;;; рисуем мультивыноску
  (setq mleader_points (vlax-make-safearray vlax-vbDouble (cons 0 (1- (length points)))))
  (vlax-safearray-fill mleader_points points)
  (setq mleader (vla-AddMLeader model_space mleader_points 0))
  ;;; устанавливаем слой
  (vla-put-Layer mleader default_layer)
  ;;; выравниваем текст по центру
  (vla-put-TextJustify mleader acAttachmentPointMiddleCenter)
  ;;; рисуем текст
  (vla-put-TextString mleader (strcat "\\pxa0.2,se0.87;" default_top_text "\\P\\pa0;" default_bottom_text))
  ;;; рисуем или не рисуем точку
  (if (= default_draw_dot "1") (vla-put-ArrowheadType mleader acArrowDot))
  ;;; устанавливаем длину полки
  (vla-GetBoundingBox mleader 'p_left 'p_right)
  (setq p_left (vlax-safearray->list p_left))
  (setq p_right (vlax-safearray->list p_right))
  (setq text_length (abs (- (car p_left) (car p_right))))
  (if (> polka_length text_length)
    (vla-put-DoglegLength mleader (/ (- polka_length text_length) 100))  
    (vla-put-DoglegLength mleader 1.5)
  ) ; if
  (if (> (car p1) (car p2))
    (progn
      (vla-SetDoglegDirection mleader 0 (vlax-3D-point '(-1 0 0)))
      (vla-SetLeaderLineVertices mleader 0 mleader_points)
    ) ; progn
  ) ; if
  ;;; удаляем временную линию
  (if (/= polyline nill)
    (if (not (vlax-erased-p polyline)) (vla-Delete polyline))
  ); if
  (princ)
) ; defun



Выноска корректно работает в прилагаемом чертеже, только в файле cs_leader.lsp нужно поправить путь к файлу cs_leader.dcl, в соответствии с тем местом, где вы его разместите.

Для использования функции в своем чертеже нужно учесть следующее:
1. Выноска строится с текущим стилем мультивыносок, поэтому нужно создать у себя такой же стиль мультивыносок, как в прилагаемом чертеже, ну или подкорректировать cs_leader.lsp.
2. В моем чертеже установлен масштаб 100 и если вы хотите использовать функцию в чертеже с другим масштабом - нужно будет подкорректировать cs_leader.lsp в месте, где задается DoglegLength (это размер полки от выносной линии до текста).

Как работать с функцией:
1. Активируем функцию командой cs_leader.
2. В появившемся диалоге устанавливаем необходимые параметры и жмем ОК.
3. Указываем точки выносной линии, которых должно быть не менее двух. Ввод точек завершаем нажатием Enter или ПКМ.
4. Идет запрос указания крайней точки полки. Возможны варианты:
4а. Указываем эту точку ЛКМ.
4б. Перемещаем курсор в ту сторону (относительно последней точки), куда хотим, чтобы откладывалась полка, жмем Enter или ПКМ.

Осталось нереализованным, но вроде как не сложным:
1. Автовключение режима ОРТО (я еще думаю, надо ли это).
2. Сохранение значений по умолчанию в файле, а не глобальных переменных.

Осталось нереализованным, но пока не особо понятным:
1. Обработка всевозможных нештатных ситуаций.
1а. Выход из программы по Esc - у меня остается временная линия, надо бы ее программно удалять.

Разметка диалога какая-то странная. Некоторые элементы при одинаковой длине почему-то занимают разную по размерам область на экране. Ну с этим-то я справился методом тыка, а вот с чем пока не справился, но хотелось бы:
1. Свободное пространство слева от элементов управления и справа почему-то разное. Хотелось бы, чтобы справа расстояние до края формы было такое же, как и слева (красные прямоугольники).
2. Две кнопки OK и Cancel заданы кодом ok_cancel и имеют разную ширину (синий прямоугольник). Хотелось бы их сделать одинаковыми. Но при замене ok_cancel на два button'а с именами "accept" и "cancel" почему-то приводит к сообщению Автокада об ошибке - ему нужно, чтобы в диалоге обязательно присутствовала кнопка выхода OK или Cancel.
Миниатюры
Нажмите на изображение для увеличения
Название: Безымянный.png
Просмотров: 49
Размер:	4.4 Кб
ID:	167643  
Вложения
Тип файла: dwg
DWG 2004
cs_leader.dwg (127.2 Кб, 12 просмотров)
Сет вне форума  
 
Непрочитано 28.03.2016, 06:44
#70
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,073


Цитата:
Сообщение от Сет Посмотреть сообщение
Я уже пытался с этими Dogleg'ами что-то сделать - ничего путного не получается, да и смысл этого свойства не очень понятен. Я задаю это свойство в двух вариантах:
Код:
[Выделить все]
 (vla-SetDoglegDirection mleader 0 (vlax-3D-point '(1 0 0)))
(vla-SetDoglegDirection mleader 0 (vlax-3D-point '(-1 0 0)))
В первом случае выносная линия отклоняется от вертикали, смещаясь влево, полка находится справа.
Во втором случае выносная линия отклоняется от вертикали вправо, полка находится слева.

----- добавлено через ~13 мин. -----
По второму варианту верх выносной линии уходит вправо визуально на ширину мультитекста. С помощью ручки выносную линию можно вернуть в вертикальное положение, при этом полка остается слева, как мне и нужно. Вопрос - каким образом получить доступ к этой точке мультивыноски, чтобы переместить ее программно?
Сразу в двух вариантах? зачем?
А на тему смещения.... если я правильно помню, это зависит от выравнивания текста.Т.е. для правильного отображения не достаточно назначить правильный вектор, нужно еще и выравнивание текста поменять и будет как то так:Видяшка
__________________
_бложиг
Boxa вне форума  
 
Автор темы   Непрочитано 28.03.2016, 09:33
#71
Сет


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
Сразу в двух вариантах? зачем?
Для тестирования эффекта.
В итоге вопрос решен.

----- добавлено через ~38 мин. -----
Появились новые "хотелки"

1. Как все-таки можно решить вопрос визуализации будущего текста мультивыноски? Устроил бы вариант хотя бы прямоугольником описывающим каким или другим примитивом, дающим представление о длине и высоте текста.
2. Можно ли при активации редактирования текста выноски двойным кликом автоматически выделять содержимое?
Сет вне форума  
 
Непрочитано 28.03.2016, 10:25
#72
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,073


Цитата:
Сообщение от Сет Посмотреть сообщение
Как все-таки можно решить вопрос визуализации будущего текста мультивыноски? Устроил бы вариант хотя бы прямоугольником описывающим каким или другим примитивом, дающим представление о длине и высоте текста.
Добро пожаловать на .net и JigEntity =о) В видяшке выше именно оно.
Цитата:
Сообщение от Сет Посмотреть сообщение
Можно ли при активации редактирования текста выноски двойным кликом автоматически выделять содержимое?
Не знаю, меня не напрягает нажать ctrl+A, хотя я стараюсь формировать содержание ДО того как делать выноску...
__________________
_бложиг
Boxa вне форума  
 
Автор темы   Непрочитано 28.03.2016, 12:01
#73
Сет


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


Цитата:
Сообщение от Boxa Посмотреть сообщение
хотя я стараюсь формировать содержание ДО того как делать выноску
Довольно часто нужно менять ее содержимое ПОСЛЕ.
Сет вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Лисп простой пользовательской выноски

Tekla Structures. Видеокурс. ЖЕЛЕЗОБЕТОН
Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Комрады, не работает простой лисп по копированию отрезка. 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