Как средствами Lisp/Autolisp масштабировать объекты в видовом экране с одновременным изменением его границ
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как средствами Lisp/Autolisp масштабировать объекты в видовом экране с одновременным изменением его границ

Как средствами Lisp/Autolisp масштабировать объекты в видовом экране с одновременным изменением его границ

Ответ
Поиск в этой теме
Непрочитано 05.08.2023, 12:58 #1
Как средствами Lisp/Autolisp масштабировать объекты в видовом экране с одновременным изменением его границ
Станислав_
 
Регистрация: 05.08.2023
Сообщений: 27

Всем добрый день! Пишу программу для оформления чертежей моделей, состоящих из 3D-блоков, при работе которой группа блоков выбирается в пространстве модели, затем создаётся лист с именем группы и на листе создаётся видовой экран с аксонометрией данной группы. Таких групп может быть много, соответственно и видовых экранов столько же. В процессе работы программа должна установить один из стандартных масштабов в созданном видовом экране и при этом границы видового экрана должны измениться, как если бы мы использовали треугольную ручку масштаба в выбранном видовом экране. Вот это у меня и не получается! Никак не могу сообразить, как это осуществить средствами Lisp/AutoLisp. На форумах очень много похожих тем, но конкретно про "треугольную ручку" для выбора масштаба ничего нет. Программирую не часто, не профессионал, поэтому решил попросить совета здесь. Работаю в AutoCAD 2021. Очень надеюсь получить ответ на этом форуме. Заранее благодарю за помощь!
Просмотров: 1473
 
Непрочитано 05.08.2023, 23:51
#2
Сергей812


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


а зачем вам ручка? Управляйте параметрами объекта ВЭ PViewport напрямую - насколько понимаю, речь идет о vla-set-customscale.
Сергей812 вне форума  
 
Автор темы   Непрочитано 06.08.2023, 08:50
#3
Станислав_


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


Сергей812, это свойство меняет масштаб отображения объекта/объектов в видовом экране, но не меняет его границ. Иначе при работе программы видовые экраны начнут перекрывать друг друга. Суть в том, чтобы по количеству групп в пространстве модели сформировать видовые экраны, компактные по размеру, и разместить их на созданном листе, чтобы они не перекрывались.
Станислав_ вне форума  
 
Непрочитано 06.08.2023, 10:27
#4
Сергей812


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


Цитата:
Сообщение от Станислав_ Посмотреть сообщение
при работе которой группа блоков выбирается в пространстве модели, затем создаётся лист с именем группы и на листе создаётся видовой экран с аксонометрией данной группы. Таких групп может быть много, соответственно и видовых экранов столько же.
откуда несколько ВЭ, если выбирается группа блоков, задается в явном или скрытом виде имя этой группы и создается одноименный лист для этой группы.
Сергей812 вне форума  
 
Автор темы   Непрочитано 06.08.2023, 11:04
#5
Станислав_


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


Цитата:
Таких групп может быть много, соответственно и видовых экранов столько же.
Так вот же, я написал это в самом первом сообщении. В каждом видовом экране будут отображаться сгруппированные объекты в разных видах: вид спереди, сверху, аксонометрия и т.п. Как в программу заложу. По ходу выполнения кода каждый созданный видовой экран должен занять своё место на созданном листе.
Станислав_ вне форума  
 
Непрочитано 07.08.2023, 20:06
#6
Сергей812


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


ну создание ВЭ - это одна задача, расположение ВЭкранов в пространстве листа - тут уже скорее задача, схожая с оптимальным раскроем, если нет дополнительных критерием к взаиморасположению видовых экранов на листе. ВЭ строится по геометрическим границам группы, а не пытаться натянуть ВЭ непонятно на что)
Сергей812 вне форума  
 
Автор темы   Непрочитано 07.08.2023, 22:27
#7
Станислав_


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


При нажатии на "треугольную ручку" видового экрана решаются сразу все задачи. И объекты в ВЭ масштабируются и границы экрана к объекту подстраиваются. Вопрос: как программно нажать эту "треугольную ручку"?!
Станислав_ вне форума  
 
Непрочитано 08.08.2023, 08:17
#8
name02


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


Прежде чем думать о частностях вроде "как программно нажать "треугольную ручку" я бы озадачился общим алгоритмом работы:
  1. Создали 3D-объекты
  2. Создали набор из объектов, для которых нужно создать лист в видовым экраном
  3. На основании набора:
    3.1 Создаем лист (просто новый лист или по шаблону, с параметрами печати или без?)
    3.2 Создаем ВЭ подходящего под формат размера
    3.3 Определяем показываемую область ВЭ - по объекту
    3.4 Определяем аксонометрическую проекцию (3D-вид)
    3.5 Определяем ближайший масштаб по полученному масштабу размеры ВЭ в пространстве листа и устанавливаем его
И уже по алгоритму смотреть что и как делать.
name02 вне форума  
 
Автор темы   Непрочитано 08.08.2023, 23:49
#9
Станислав_


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


Так ребята, давайте расставили все точки над ё! Если не понятно из моего первого сообщения, то я уже написал работоспособный массив кода, при работе которого выбирается группа объектов, создаётся лист с именем этой группы, на листе создаётся ВЭ с отображением этой самой группы объектов, далее через команду zoom по объекту происходит масштабирование объектов в видовом экране... А дальше я спрашиваю, как сделать так, чтобы установить в видовом экране один из стандартных масштабов и одновременно изменить границы ВЭ, как если бы мы нажали треугольную кнопку на выделенном ВЭ и выбрали какой-нибудь стандартный масштаб! Ну сколько раз мне ещё нужно повторить текст моего первого сообщения или вы начинаете читать с конца? Ребята есть мысли, как это сделать, так подскажите!

Цитата:
Сообщение от name02 Посмотреть сообщение
Прежде чем думать о частностях вроде "как программно нажать "треугольную ручку" я бы озадачился общим алгоритмом работы:
  1. Создали 3D-объекты
  2. Создали набор из объектов, для которых нужно создать лист в видовым экраном
  3. На основании набора:
    3.1 Создаем лист (просто новый лист или по шаблону, с параметрами печати или без?)
    3.2 Создаем ВЭ подходящего под формат размера
    3.3 Определяем показываемую область ВЭ - по объекту
    3.4 Определяем аксонометрическую проекцию (3D-вид)
    3.5 Определяем ближайший масштаб по полученному масштабу размеры ВЭ в пространстве листа и устанавливаем его
И уже по алгоритму смотреть что и как делать.
Вчера написал ответ на это сообщение, но так его и не увидел, поэтому отвечаю сейчас. Я уже всё это проделал. Мой код работает ровно до того момента, когда нужно программно изменить границы видового экрана. Это я описал в своём самом первом сообщении! Господа, кто-нибудь может ответить на мой вопрос?

Последний раз редактировалось Кулик Алексей aka kpblc, 10.08.2023 в 17:17.
Станислав_ вне форума  
 
Непрочитано 11.08.2023, 11:02
#10
name02


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


(entmod) для ВЭ не получится использовать, надо через vla-функции.

Координаты верхнего левого и нижнего правого угла есть, но их можно только прочитать.
У видового экрана есть центр (X, Y, Z) и высота и ширина - их можно и читать и устанавливать

Код:
[Выделить все]
 (defun c:tst ( / obj pt0 obj_height obj_width)
;;;преобразуешь ВЭ в vla-объект
  (setq obj (vlax-ename->vla-object (car (entsel))))

;;;  Получаешь координаты центра, высоту и ширину
  (setq pt0 (vla-get-center obj))
  (setq obj_height (vla-get-height obj))
  (setq obj_width (vla-get-width obj))

;;;  Задаешь новые размеры
  (vla-put-height obj 500)
  (vla-put-width obj 300)

) ;_ end defun
Но учти, что размер ВЭ изменится симметрично относительно центра. Поэтому, если хочешь в одном направлении менять, то придется еще и центр ВЭ заново переопределять!

Последний раз редактировалось name02, 11.08.2023 в 11:15.
name02 вне форума  
 
Автор темы   Непрочитано 13.08.2023, 09:11
#11
Станислав_


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


name02, свойства vla-get-height и vla-get-width, также как и свойства vla-put-height и vla-put-width я уже пытался использовать в своём коде. Но эти функции только считывают или изменяют границы видового экрана. Получается, нужно связать функции vla-put-height и vla-put-width, а также команду zoom по группе объектов, в одном коде, вычисляя оптимальные границы видового экрана. Вопрос: как это сделать?
Станислав_ вне форума  
 
Непрочитано 14.08.2023, 06:29
#12
name02


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


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

Цитата:
Сообщение от Станислав_ Посмотреть сообщение
затем создаётся лист с именем группы и на листе создаётся видовой экран с аксонометрией данной группы
  1. Вкладка "Лист" создается с набором параметров для печати - т.е. заданными принтером и размером листа ? Может вкладка "Лист" создается с рамкой формата и штампом?
    Если создается лист (вкладка), в котором настроены принтер и выбран размер бумаги, то можно создать ВЭ любого размера, а затем задать печать - область печати "Рамка", масштаб печати "Вписать".
    Если у тебя уже какое-то оформление будет - рамка формата, то тут сложнее. ВЭ экран где создавать - надо определить координаты внутри определенной области.
  2. Если есть оформление чертежа на листе, то как оно сделано - в виде блока или примитивами (отрезками, полилиниями и т.п.)?
  3. Будет ли еще какие-то объекты на листе?

Вот видишь сколько еще вопросов! А ты спрашивал про "программную реализацию нажатия треугольной ручки видового экрана"
name02 вне форума  
 
Автор темы   Непрочитано 14.08.2023, 07:44
#13
Станислав_


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


Попробую объяснить более подробно алгоритм работы моей программы и компановку получаемого чертежа. Запускаем программу, выбираем сформированную группу объектов на модели, при этом автоматически создаётся лист (по шаблону, в котором есть рамка листа и штамп) и ему присваивается имя группы. Затем этот лист открывается, в нём создаётся ВЭ заданного размера, в нем отображается только выделенная группа объектов, далее происходит вход в модель через видовой экран и zoom по объекту, выход из модели, в этом месте границы экрана и принимают "оптимальные размеры". (*) Создаётся следующий видовой экран, например, с видом сбоку этой же группы объектов, при этом повторяются действия с выходом в модель через видовой экран и zoom по объекту. Этот и следующие ВЭ-ы при создании размещаются в определённых местах листа, с учётом расположения предыдущих ВЭ-в начиная со второго. Далее создаётся ещё насколько таких экранов но уже с другими видами. В перспективе дополнение листа видовыми экранами с другими группами при указании целевого листа с их расположением. В месте, где я поставил зввёздочку, и должно выполняться изменение границ экрана с зумом и выбором стандартного масштаба. Нужно это для того, чтобы в последствии при размещении созданных ВЭ-в на листе, они бы не перекрывались, иначе проблемы с отображением объектов и ручная правка границ ВЭ-в. Вооооот...
Станислав_ вне форума  
 
Непрочитано 14.08.2023, 16:12
#14
name02


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


Честно говоря, я очень ориентировочно представляю как это сделать. Прежде всего из-за распределения области чертежа под ВЭкраны.

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

?

Может сделать шаблоны листов уже с ВЭ и в них "распихивать" нужные виды?
name02 вне форума  
 
Непрочитано 14.08.2023, 16:40
#15
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


Как я понял, процесс оптимизации, отмеченный (*), умеет делать сам Автокад, при нажатии мышкой на некую "треугольную ручку" ?

Приложи к сообщению, плиз:

а) Файл *.dwg - ДО нажатия "треугольной ручки"
б) Файл *.dwg - ПОСЛЕ нажатия "треугольной ручки"
в) Скрин с этой самой "треугольной ручкой"

а то все так и будут гадать до бесконечности...
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Непрочитано 14.08.2023, 16:41
#16
Кулик Алексей aka kpblc
Moderator

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


ИМХО достаточно установить CustomScale для VP, а масштабирование выполнять как масштабирование любого другого объекта
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 14.08.2023, 22:34
#17
Станислав_


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


===AAA===, выглядит это так:
группа объектов в видовом экране
Нажмите на изображение для увеличения
Название: Снимок_2.PNG
Просмотров: 11
Размер:	43.6 Кб
ID:	258091
выделяем экран и в его центре появляется треугольная ручка
Нажмите на изображение для увеличения
Название: Снимок_3.PNG
Просмотров: 12
Размер:	27.2 Кб
ID:	258092
при нажатии на ручку раскрывается выпадающий список со стандартными масштабами
Нажмите на изображение для увеличения
Название: Снимок_4.PNG
Просмотров: 11
Размер:	52.2 Кб
ID:	258093
итог выбора стандартного масштаба через ручку
Нажмите на изображение для увеличения
Название: Снимок_5.PNG
Просмотров: 12
Размер:	24.4 Кб
ID:	258094
Станислав_ вне форума  
 
Непрочитано 15.08.2023, 06:31
#18
===AAA===


 
Регистрация: 15.08.2005
г. Норильск
Сообщений: 616


А, так никакой "волшебной оптимизации расположения экрана" не происходит?
Судя по картинке, его центр остаётся на прежнем месте?
__________________
Счастливо, Алексей!
===AAA=== вне форума  
 
Автор темы   Непрочитано 15.08.2023, 09:00
#19
Станислав_


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


Да дело-то не в центре, а в том, при выборе масштаба через эту самую ручку зуммируется весь видовой экран вместе с содержимым. "Волшебная оптимизация будет дальше", если кто-нибудь всё-таки сможет объяснить, как программно выбрать масштаб, как если бы я это делал через эту ручку...
Станислав_ вне форума  
 
Непрочитано 15.08.2023, 09:15
#20
name02


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


Код:
[Выделить все]
 
;vp_entity - ВЭ, для которого нужно изменить масштаб
;scale_factor - масштаб
(setq VP (vlax-ename->vla-object vp_entity)
(vla-put-CustomScale VP scale_factor)
а размер уже менять либо через vla-put-height и vla-put-width, либо через просто масштабирование
name02 вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Как средствами Lisp/Autolisp масштабировать объекты в видовом экране с одновременным изменением его границ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не отображается текст в видовом экране Nastya_sv AutoCAD 30 24.04.2019 15:33
Отображение веса линий в видовом экране. Андрюха_вода AutoCAD 46 29.08.2014 12:38
Динамический блок не отображается в видовом экране E_note Динамические блоки 3 07.06.2012 09:26
Как сделать объекты, отображенные в Видовом Экране, невидимыми, не пользуясь слоями. ant_bar AutoCAD 15 25.02.2009 14:49
Как сделать разрыв в видовом экране? viter_alex AutoCAD 25 19.10.2008 17:31