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

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как сделать масштабирование с предпросмотром (как в дефолтной функции автокада)

Как сделать масштабирование с предпросмотром (как в дефолтной функции автокада)

Ответ
Поиск в этой теме
Непрочитано 04.07.2016, 18:35 #1
Как сделать масштабирование с предпросмотром (как в дефолтной функции автокада)
valerik88
 
Регистрация: 02.07.2016
Сообщений: 249

Хочу сделать функцию масштабирования, что бы можно было взять и мышью вытянуть объект до нужной величины (а не как по умолчанию, мышью через длину отрезка задаётся величина масштаба).

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

Вопрос 1: Как сделать подобный динамический предпросмотр детали? Возможно ли вообще такое средствами Autolisp?

Вопрос 2: Есть ли какой-то простой способ узнать габариты выделенного элемента/примитива/блока? Ну т.е. грубо говоря минимальные размеры прямоугольника, в который этот элемент влезет.


(Прикладываю последнюю версию сделанной в рамках этой темы функции)

Вложения
Тип файла: lsp mashtab.lsp (42.6 Кб, 55 просмотров)


Последний раз редактировалось valerik88, 24.07.2016 в 20:53.
Просмотров: 6800
 
Непрочитано 04.07.2016, 20:23
1 | #2
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Как сделать подобный динамический предпросмотр детали? Возможно ли вообще такое средствами Autolisp?
Как вариант - загнать объекты в анонимный блок, объекты удалить, блок вставить, читать через grread положение курсора и устанавливать для вхождения блока соответствующие коэффициенты. Потом блок разбить.

Цитата:
Сообщение от valerik88 Посмотреть сообщение
Есть ли какой-то простой способ узнать габариты выделенного элемента/примитива/блока? Ну т.е. грубо говоря минимальные размеры прямоугольника, в который этот элемент влезет.
vla-getboundingbox; acet-ent-geomextents... На форуме можно поискать - варианты были. Что vla-, что acet- имеют свои ограничения.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 05.07.2016, 17:11
#3
valerik88


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Как вариант - загнать объекты в анонимный блок, объекты удалить, блок вставить, читать через grread положение курсора и устанавливать для вхождения блока соответствующие коэффициенты. Потом блок разбить.
Сделал всё как ты сказал, и получилось хорошо. Но возникла проблемка. При разбиение блока, он не просто разбивается, разбиваются примитивы внутри этого блока. На видео показал это.
https://youtu.be/jFxSRtNNIQo

Разбивал блок двумя способами

Код:
[Выделить все]
 
  (command "_explode" (vlax-vla-object->ename vlaB))
  (vla-Explode vlaB)
Оба способа разбивают одинаково
Вложения
Тип файла: lsp mashtab.lsp (3.5 Кб, 55 просмотров)
valerik88 вне форума  
 
Непрочитано 05.07.2016, 17:50
1 | #4
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Разбивал блок двумя способами
http://autolisp.ru/2014/07/29/explode-vs-vla-explode/
Глобальное переназначение обработчика ошибок... Точно жить надоело! http://autolisp.ru/2009/09/13/error-catch/ + http://autolisp.ru/2012/03/16/user-request/ + http://autolisp.ru/2016/01/11/undo-error-acad/
СОздание блока, конечно, сделано по принципу "В Баку через Москву из Питера с заездом в Магадан". Да еще и с постоянным созданием примитива... Если по-другому никак, то см. функции getcorner, или grvecs, grdraw. Заодно и подумай, что и как будет происходить
Поищи разницу между vla-erase и vla-delete.

----- добавлено через ~3 мин. -----
P.S. Кстати, посмотри опцию команды _.scale: _reference
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 08.07.2016, 18:41
#5
valerik88


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


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Глобальное переназначение обработчика ошибок... Точно жить надоело
Да это я бездумно откуда-то скопировал, думал разберусь с этим позже, но просто забыл

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
СОздание блока, конечно, сделано по принципу "В Баку через Москву из Питера с заездом в Магадан"
Как нагуглил, так и сделал.. Способа проще просто не нашёл

Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Если по-другому никак, то см. функции getcorner, или grvecs, grdraw
Заюзал grdraw, прикольная штука, не знал о ней.

Но главная проблема так и осталась. При разбиении блока, разбивается и всё внутри него
https://youtu.be/e8NWWb1TCpU

Пробовал создавать блок через командную строку командой (command "._block".....) и вставлял его командой (command "._insert" ....), при этом проблема с разбиением объектов исчезает! Очевидно я как-то не правильно создаю или вставляю блоки, может не указываю каких-то параметров, которые указываются по умолчанию при использовании командной строки. Но при использовании командной строки появляется другая проблема - моргание, видимо этот способ медленнее, меня это моргание вообще не устроило.

Сейчас ищу другой способ создания блоков. Нашёл команду (vla-add blocks ...), которая создаёт пустой блок. Пока не могу найти способ добавить в этот пустой блок выделенные объекты. Всё же интересует чем не правилен этот код
Код:
[Выделить все]
 
(defun makeblock  (sel pt / slen n ent i)
;Создаём описание блока
  (entmake (list
		   (cons 0 "BLOCK")	;Блок
		   (cons 2 "*Unnn")	;Имя блока или "*Unnn" - анонимный
		   (cons 8 "0")		;Слой
		   (cons 10 pt)		;Базовая координата
		   (cons 70 1)		;0 - простой блок 1 - анонимный блок
		  )
  );end entmake


  ;Кол-во выбранных объектов
  (setq slen (SSLENGTH sel))
  ;Удаляем объекты и вставляем их в блок
  (setq i 0)
  (while (< i slen)
     ;имя объекта
     (setq n (ssname sel i))
     ;Описание объекта
     (setq ent (entget n))
     ;Удаляем объект
     (ENTDEL n)
     ;Вставляем объект внутри блока
     (ENTMAKE ent)
    
    (setq i (1+ i))
  );end while

  ;Закрываем описание блока, получаем его имя
  (entmake '((0 . "ENDBLK")(100 . "AcDbBlockEnd"))))
Почему он создаёт блок, который отличается от блока, создаваемого из командной строки командой "._block"





Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Поищи разницу между vla-erase и vla-delete.
Искал, нашёл описание функций на английском.. понял довольно смутно, как будто erase удаляет полностью, а delete не полностью... хз правильно ли понял.




Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Кстати, посмотри опцию команды _.scale: _reference
Вот про это даже не знал, выходит велосипед изобретаю. Но мне мой велосипед всё равно нравится больше дефолтного, он мне кажется проще и понятней (если работать заставлю)
valerik88 вне форума  
 
Непрочитано 08.07.2016, 21:18
#6
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Искал, нашёл описание функций на английском.. понял довольно смутно, как будто erase удаляет полностью, а delete не полностью... хз правильно ли понял.
Если мне не изменяет мой склероз, то vla-erase для графических примитивов, а vla-delete - для неграфических. Удалить описание блока через vla-erase невозможно.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 08.07.2016, 23:49
1 | #7
skkkk


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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
При разбиение блока, он не просто разбивается, разбиваются примитивы внутри этого блока.
Цитата:
Сообщение от valerik88 Посмотреть сообщение
Но главная проблема так и осталась. При разбиении блока, разбивается и всё внутри него
Так взрываются, например, блоки, которые имеют разный масштаб по осям. Может, еще что-то с ним случилось - без файла остается только гадать.
skkkk вне форума  
 
Непрочитано 09.07.2016, 07:38
#8
VVA

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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
Почему он создаёт блок, который отличается от блока, создаваемого из командной строки командой "._block"
Потому что ты создаешь анонимный блок. Его можно создать программно.
Об этом в функции даже написано в примечании
Цитата:
(cons 2 "*Unnn") ;Имя блока или "*Unnn" - анонимный
__________________
Как использовать код на Лиспе читаем здесь

Последний раз редактировалось VVA, 09.07.2016 в 09:02.
VVA вне форума  
 
Автор темы   Непрочитано 09.07.2016, 09:52
#9
valerik88


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Так взрываются, например, блоки, которые имеют разный масштаб по осям. Может, еще что-то с ним случилось - без файла остается только гадать.
Да файл в первом посте, проблема ещё там была, но приложу последнюю версию.


Цитата:
Сообщение от VVA Посмотреть сообщение
Потому что ты создаешь анонимный блок. Его можно создать программно.
Об этом в функции даже написано в примечании
Нет, дело не в этом, то что он отличается, я имел в виду, что он разбивается не так, как тот, что создан через командную строку. Если создать блок через командную строку, объекты внутри блока не будут разбиты. А при разбивке моего блока они тоже разбиваются. Я делал и не анонимные блоки, проблема остаётся.


Прикладываю файл, там есть несколько лишних функций (просто экспериментирую с другими способами создания блока)
Вложения
Тип файла: lsp mashtab.lsp (11.3 Кб, 42 просмотров)
valerik88 вне форума  
 
Непрочитано 09.07.2016, 10:05
1 | #10
VVA

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


В качестве предположения. В этом коде при вставке в блок удаляются dxf группы 5 и 330

----- добавлено через ~1 ч. -----
Цитата:
Сообщение от valerik88 Посмотреть сообщение
Нашёл команду (vla-add blocks ...), которая создаёт пустой блок. Пока не могу найти способ добавить в этот пустой блок выделенные объекты
здесь посмотри Все выбранное в блок. Напомните ЛИСП. (см vla-copyobjects)
__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Автор темы   Непрочитано 09.07.2016, 11:34
#11
valerik88


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


Цитата:
Сообщение от VVA Посмотреть сообщение
при вставке в блок удаляются dxf группы 5 и 330
Попробовал использовать ту функцию, результат аналогичный моему. Блок разбивается, объекты внутри блока тоже разбиваются.

----- добавлено через ~22 мин. -----
Цитата:
Сообщение от VVA Посмотреть сообщение
здесь посмотри Все выбранное в блок. Напомните ЛИСП. (см vla-copyobjects)
То что надо! Это и искал, спасибо
Всё заработало) https://youtu.be/bAnfRGI5X1k

----- добавлено через ~42 мин. -----
Обнаружил вероятную причину того, почему при разбиении блока, у меня разбивались элементы внутри него. Сейчас для вставки блока использую функцию
Код:
[Выделить все]
 (vla-insertblock csp (vlax-3d-point p1)(vla-get-name blockDef) mas mas mas 0.0)
Так вот, экспериментируя с ней обнаружил, что если вместо масштаба по оси Z задать любое число, которое не равно масштабу по осям X и Y, то при разбиении блока, элементы внутри него тоже разбиваются. Я же изначально вставлял блок кодом
Код:
[Выделить все]
  (entmake (list
		     (cons 0 "INSERT")	;Вставка блока
		     (cons 2 blkName)	;Имя блока
		     (cons 10 p1)	;Координаты вставки
		     (cons 41 mas)	;Масштаб по X
		     (cons 42 mas)	;Масштаб по Y
		    )
	  );end entmake
где вообще не указывал масштаб по оси Z. Вот эта разница в масштабах по разным осям и не позволяла взорвать блок как мне надо.

Цитата:
Сообщение от skkkk Посмотреть сообщение
Так взрываются, например, блоки, которые имеют разный масштаб по осям.
Ты был прав.

Последний раз редактировалось valerik88, 09.07.2016 в 14:19.
valerik88 вне форума  
 
Автор темы   Непрочитано 09.07.2016, 14:53
#12
valerik88


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


Всё, вот последний вариант функции. Добавил обработку ошибок. Всё работает как я задумывал изначально. Всем спасибо за участие
Вложения
Тип файла: lsp mashtab.lsp (3.9 Кб, 54 просмотров)

Последний раз редактировалось valerik88, 09.07.2016 в 15:28.
valerik88 вне форума  
 
Непрочитано 09.07.2016, 18:35
#13
skkkk


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


Я сначала как-то пропустил мимо ушей этот код, поскольку не мог себе представить, где смогу его применить. Сейчас запустил и понял: стандартный предпросмотр при масштабировании, который мало того, что моргает, к тому же я не знаю, как нежно надо уметь водить мышью, чтобы хоть приблизительно суметь поймать нужный размер, - барахло по сравнению с такой визуализацией. Я никогда и не связывался с этим делом: чаще всего нужен точный масштаб - и вводишь коэффициент, Enter. А тут прям послушно так увеличивается/уменьшается - мне понравилось. Серьезно, как идея, так и реализация. По крайней мере то, что я увидел - в код особо не вникал.
Понимаю, что программка создавалась скорее всего для визуализации масштаба "на глазок", однако, позволю себе пару замечаний, как пользователь.
1. Почему бы не сделать стандартный выбор объектов (ssget)? Имею в виду, не опоясывающей рамкой, а универсальной, да еще и с возможностью единичного выбора? Полагаю, такой подход принят с целью исключить указание базовой точкиДа, придется указывать базовую точку отдельно, но привычка на это уже выработана у всех годами.
2. Динамический прямоугольник на мой взгляд - вообще лишний. Если его контур совпадет с прямоугольным объектом, то это затрудняет восприятие визуализации, а толку от этой пунктирной рамки мне понять не удалось.
3. Хорошо бы иметь возможность ввести нужный коэффициент, по-моему, с grvecs реально такое провернуть.
4. Ну и курсор во время визуализации я бы тоже убрал.

И смело - на замену стандартному _scale
skkkk вне форума  
 
Автор темы   Непрочитано 09.07.2016, 20:19
#14
valerik88


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


Цитата:
Сообщение от skkkk Посмотреть сообщение
Сейчас запустил и понял: стандартный предпросмотр при масштабировании, который мало того, что моргает, к тому же я не знаю, как нежно надо уметь водить мышью, чтобы хоть приблизительно суметь поймать нужный размер
Как заметил выше товарищ Алексей Кулик "P.S. Кстати, посмотри опцию команды _.scale: _reference"
https://youtu.be/qNfjoFGVGhw
В русской локализации при масштабирование это называется "опорный отрезок", нужно выбрать опорный отрезок и тогда масштабировать можно плавно, как в моей функции. Минус в том, что нужно дополнительно выбирать этот самый опорный отрезок и в том, что пунктиром виден ещё не масштабированный вид (для кого-то это может даже плюс) и в том, что изображение моргает. Плюс же в том, что при масштабировании работает привязка (в моей функции почему-то привязка во время масштабирования не работает(



Цитата:
Сообщение от skkkk Посмотреть сообщение
Полагаю, такой подход принят с целью исключить указание базовой точки
и с целью исключить указание опорного отрезка.
Вообще изначально я хотел без рамочки сделать простым ssget, а вместо указания опорной точки и опорного отрезка вычислить их через функции, которые мне во 2м посте посоветовали getboundingbox и др... это тоже вариант, который можно попробовать проработать.

Цитата:
Сообщение от skkkk Посмотреть сообщение
2. Динамический прямоугольник на мой взгляд - вообще лишний. Если его контур совпадет с прямоугольным объектом, то это затрудняет восприятие визуализации, а толку от этой пунктирной рамки мне понять не удалось.
Ну хз.. мне она кажется удобна для визуального восприятия насколько масштаб увеличивается. В любом случае её убрать легко будет (2 строки в коде закомментировать).

Цитата:
Сообщение от skkkk Посмотреть сообщение
3. Хорошо бы иметь возможность ввести нужный коэффициент, по-моему, с grvecs реально такое провернуть.
Пока не очень понимаю как вообще мне такое провернуть, и причём тут grvecs, но подумаю над этим, было бы удобно, тогда бы вообще от стандартной функции масштабирования отказался.

Цитата:
Сообщение от skkkk Посмотреть сообщение
4. Ну и курсор во время визуализации я бы тоже убрал.
Тоже пока без понятия как это сделать, но я бы лучше его оставил и добавил бы как-нибудь возможность привязки... а то не работает зараза во время масштабирования.
valerik88 вне форума  
 
Непрочитано 09.07.2016, 21:44
#15
VVA

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


Цитата:
Сообщение от valerik88 Посмотреть сообщение
и причём тут grvecs
Не grvecs а grread
Примеры
http://elpanov.com/index.php?id=26
http://www.lee-mac.com/grtext.html
http://www.lee-mac.com/searchresults...lee-mac.com%2F
Очень много примеров здесь https://www.theswamp.org/index.php?topic=12813.135







__________________
Как использовать код на Лиспе читаем здесь
VVA вне форума  
 
Непрочитано 09.07.2016, 22:52
#16
skkkk


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


Цитата:
Сообщение от VVA Посмотреть сообщение
Не grvecs а grread
Да-да, прошу прощения, конечно, grread. Один из ее аргументов позволяет считывать ввод данных с устройства указания, еще один - как раз отвечает за форму курсора (или его отсутствие).

Поищи - было решение и с привязками, точнее, с "псевдопривязками", работающими в купе с семейством gr-функций. Поведение их было, насколько я помню, не совсем привычным, но лучше, чем никаких.
skkkk вне форума  
 
Непрочитано 16.07.2016, 00:20
1 | #17
Дима_

Продуман
 
Регистрация: 22.02.2007
Питер
Сообщений: 2,840


Решение с привязками (псевдопривязками) - видео во вложении
__________________
Когда в руках молоток все вокруг кажется гвоздями.
Дима_ вне форума  
 
Автор темы   Непрочитано 20.07.2016, 21:26
#18
valerik88


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


Немного доработал под свои нужды: Сделал, что бы при масштабировании размерные линии тоже масштабировались (высота текста, размеры стрелок, выноски линий, отступ текста от линии), но при этом сам размер остаётся прежним (за счёт изменения параметра масштаба размерной линии).

Короче, демонстрация https://youtu.be/jvAuxf5HN-Q

Так же добавил вывод цифрами масштаба, с помощью функций от Mac Lee из поста товарища VVA. Как сделать ввод масштаба с клавиатуры при использовании grread не знаю. С привязками пока разобраться не пробовал.
Вложения
Тип файла: lsp mashtab.lsp (24.6 Кб, 40 просмотров)
valerik88 вне форума  
 
Непрочитано 21.07.2016, 19:53
1 | #19
frostmourn


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


Прикольная штука!
Цитата:
Сообщение от valerik88 Посмотреть сообщение
Как сделать ввод масштаба с клавиатуры при использовании grread не знаю.
Например, так (во вложении). Не особо изящно, но вроде работает.
Я там ещё поменял немножко, чтоб при пересечении начальной точки не вылетало, и рамку выбора сделал наподобие стандартной, секущей/охватывающей.
С вашего позволения.
Курсор гасить тоже пробовал, но мне не понравилось - во время ёрзания неприятно мигает, а так хотя бы за прицелом меньше заметно.
Вложения
Тип файла: lsp mashtab.lsp (25.1 Кб, 41 просмотров)
frostmourn вне форума  
 
Автор темы   Непрочитано 21.07.2016, 20:51
#20
valerik88


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


Цитата:
Сообщение от frostmourn Посмотреть сообщение
Например, так (во вложении).
Клёво! Осталось привязку присобачить))

PS: правда ты там накосячил, в твоей функции не работает моё масштабирование размерных линий. Но я поправил.
Вложения
Тип файла: lsp mashtab.lsp (25.1 Кб, 52 просмотров)

Последний раз редактировалось valerik88, 21.07.2016 в 21:16.
valerik88 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как сделать масштабирование с предпросмотром (как в дефолтной функции автокада)

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработка ПОС, искусство проектирования Tyhig Технология и организация строительства 117 25.11.2021 17:38
Как сделать выражение в таблицах под тип ExсeL dim5678 AutoCAD 8 12.06.2013 14:57
как сделать твердотельную модель и сделать ее чертеж, потом перенести в солидворкс denya43 AutoCAD 5 24.12.2012 18:42
как сделать сопряжение в нужной точке? rtyu AutoCAD 4 08.08.2012 16:43