Сообщество программистов Autodesk в СНГ

ADN Club => AutoCAD .NET API => Тема начата: Пашин Евгений от 27-08-2015, 12:46:06

Название: Как программно задать видовому экрану именованный вид?
Отправлено: Пашин Евгений от 27-08-2015, 12:46:06
Подскажите, как задать видовому экрану листа именованный вид?

1. Имеется несколько объектов в пространстве модели.
2. Каждому объекту соответствует свой именованный вид.
3. Для каждого объекта создаем лист с видовым экраном.
4. Теперь у каждого видового экрана нужно переназначить фокус на объект в виде именованного вида.

Вопрос решить нужно именно с помощью перенастройки видовых экранов на именованный вид!
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 27-08-2015, 12:47:04
Снова вопрос не в том разделе? VBA или .NET?
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Пашин Евгений от 27-08-2015, 12:56:54
Да уж! VB.NET, конечно же.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 27-08-2015, 13:02:02
Давай пример чертежа, чтобы было понятно о чем речь.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Пашин Евгений от 27-08-2015, 13:12:55
Хорошо!

Суть сводится к тому, что имеется две рамки в пространстве модели и соответствующие им листы с видовыми экранами.
Я определил границы объектов и задал им именованный вид OBJ-1 и OBJ-2 соответственно.
Теперь хочу, чтобы в первом листе был OBJ-1, вписанный в видовой экран, а на втором листе OBJ-2, вписанный в видовой экран.
Почему вписанный? Потому что оригинальный размер объектов в пространстве модели в 100 раз больше каждого из видовых экранов в листах.
Но на печать уйдет видовой экран с заданными размерами!

Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 27-08-2015, 13:34:38
Ну простейший вариант - командными методами. Переходишь в нужный лист, переключаешься в нём в пространство модели, запускаешь команду _-VIEW и указываешь именованный вид.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 27-08-2015, 13:55:39
Такой вариант устраивает? Если нет, то попробую вечером посмотреть вариант с использованием чистого AutoCAD .NET API.
Командными методами это выглядит так:
Цитировать
Command: _LAYOUT
Enter layout option [Copy/Delete/New/Template/Rename/SAveas/Set/?] <set>:_Set
Enter layout to make current <А2_верт>: а1_гор
Restoring cached viewports - Regenerating layout.

Command: _MSPACE

Command: -VIEW
Enter an option [?/Delete/Orthographic/Restore/Save/sEttings/Window]: _restore
Enter view name to restore: obj-1

Command: _LAYOUT
Enter layout option [Copy/Delete/New/Template/Rename/SAveas/Set/?] <set>:_Set
Enter layout to make current <а1_гор>: А2_верт
Restoring cached viewports - Regenerating layout.

Command: _MSPACE

Command: -VIEW
Enter an option [?/Delete/Orthographic/Restore/Save/sEttings/Window]: _restore
Enter view name to restore: obj-2
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Пашин Евгений от 27-08-2015, 15:33:30
Я попробую и отпишусь. Спасибо!
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 27-08-2015, 15:43:27
Я вот что еще подумал. Чтобы не спрашивать на каждом листе имя именованного вида желательно сделать так, чтобы имя листа и имя вида совпадали, или в крайнем случае по имени листа можно было однозначно определить имя вида.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Пашин Евгений от 27-08-2015, 15:49:05
КРУТО! РАБОТАЕТ!

Заранее имя листа не известно. Дело в том. что объекты в пространстве модели будут определяться автоматически, затем автоматически будут создаваться листы и их имена будут генерироваться по порядку "OBJ-№ объекта". Пока как-то планируется. Но все равно спасибо!!! +500 к Вашей карме! И еще, а как можно после MSPACE отключить фокус на видовом экране? Можете какую-нибудь команду подсказать?
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 27-08-2015, 16:15:01
И еще, а как можно после MSPACE отключить фокус на видовом экране? Можете какую-нибудь команду подсказать?
Если я правильно понял о чем ты, то наверное _PSPACE
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 27-08-2015, 16:16:56
Заранее имя листа не известно. Дело в том. что объекты в пространстве модели будут определяться автоматически, затем автоматически будут создаваться листы и их имена будут генерироваться по порядку "OBJ-№ объекта".
Ну так и именованные виды могут быть "OBJ-№ объекта".
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Windcastle от 28-08-2015, 05:10:14
Да, так и будет скорее всего ))) PSPACE - в яблочко!
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 30-03-2022, 16:57:47
Здравствуйте не знаю жива ли тема. В общем понять не могу, выручайте. Задача следующая есть массив чертежей - хочу разделить их на листы VB.NET
Код - vb.net [Выбрать]
  1. CadApp = New AcadApplication
  2.         CadApp.ActiveDocument.Close()
  3.         CadApp.Documents.Open("d:\System\OneDrive\Спецификация\Обработка\Листы.dwg")
  4.         CadApp.Visible = True
  5.         CadDoc = CadApp.ActiveDocument
  6.         CadUT = CadDoc.Utility
  7.  
  8.         Dim Y As Integer
  9.         Dim XY1(0 To 1) As Double
  10.         Dim XY2(0 To 1) As Double
  11.         X = 0
  12.         Do Until X = grdList.RowCount - 1
  13.             CadLayot = CadDoc.Layouts.Add("TRex-" & X + 1)
  14.             CadDoc.ActiveLayout = CadLayot
  15.             CadDoc.SetVariable("PSLTSCALE", 0) ' отключаем "Масштаб в единицах пространства листа" для корректного отображения линий
  16.             CadLayot = CadDoc.ActiveLayout
  17.             CadLayot.PaperUnits = AcPlotPaperUnits.acMillimeters
  18.  
  19.             Y = CadDoc.PaperSpace.Count - 1 ' удаляю все видовые экраны, обычно один, но лучше циклои пройду
  20.             Do Until Y = 0
  21.                 CadDoc.PaperSpace.Item(Y).Delete()
  22.                 Y = Y - 1
  23.             Loop
  24.  
  25.             CadCenter(0) = 210 : CadCenter(1) = 148.5 : CadCenter(2) = 0
  26.             CadVport = CadDoc.PaperSpace.AddPViewport(CadCenter, 420, 297)
  27.             CadDoc.ActiveSpace = AcActiveSpace.acPaperSpace
  28.             CadDoc.Application.ZoomExtents()
  29.  
  30.             CadVport.ViewportOn = True
  31.             CadVport.CustomScale = 1 ' масштаб внутри листа
  32.             CadVport.Display(True) ' вхожу в редактирование модели в окне листа
  33.             CadDoc.MSpace = True ' вошёл в редактирование модели в окне листа
  34.            
  35.             CadVport.DisplayLocked = True ' блокировка видового экрана
  36.             'настройки печати
  37.             CadLayot.ConfigName = "DWG To PDF.pc3" ' tsPrint_O.Text ' вписываю принтер так как надо знать форматы бумаги, а с этим пока проблема "DWG To PDF.pc3"
  38.             CadLayot.PlotRotation = 2 'поворот 2-книжная 3-альбомная
  39.  
  40.             CadLayot.StandardScale = 16 '16 - 1:1 ,  0 - вписать смотри страницы 350-351 книги по автокаду
  41.             CadLayot.StyleSheet = "monochrome.ctb" 'стиль печати - монохром
  42.             'цветозависимый (хз как настроить, но вроде по умолчанию стоит)
  43.             CadLayot.PlotWithPlotStyles = True 'учитывать стили печати
  44.             CadLayot.PlotWithLineweights = True 'учитывать вес линий
  45.             CadLayot.PaperUnits = 1 'acMillimeters 'ед. измерения
  46.             CadLayot.RefreshPlotDeviceInfo() ' не знаю что делает - отключал ни на что не повлияло
  47.  
  48.             X = X + 1
  49.         Loop

Выше мой Франкенштейн собирал с разных источников и как бы всё ни чего, не могу понять как программно редактировать видимую часть в листе. Элементы типа AcadView не подходят так как они  делают массив экранов, но не вставляет их в лист.

Вообще в идеале покажите как клонировать лист и изменить его видимую часть, потому как настройка печати это дебри и в них я пока не планировал вникать.

Вот скрин чертежа, ну скажем так к примеру:
(https://i.postimg.cc/cgcsC05T/2022-03-30-195338.png) (https://postimg.cc/cgcsC05T)
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 30-03-2022, 17:04:49
D_TRex,
Приветствую на форуме!
Прочитай у меня в подписи правило форматирования кода на форуме!
По существу вопроса я не понял что именно тебе нужно.
не могу понять как программно редактировать видимую часть в листе.
Что имеется в виду? Редактировать примитивы AutoCAD, которые содержатся в модели, но видны в листе через видовой экран? Тогда их просто нужно редактировать в модели.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 30-03-2022, 17:12:03
Александр Ривилис, Видел несколько Ваших постов и пробовал применить. Я новичёк тут и вообще на форумах, так что не совсем понял про форматирование, точнее вставил в тег code.

Но увидел видео, впредь если доведётся то буду форматировать как нужно, мой пост то Вы поправили

По сути вопроса, я же скинул картинку и вроде описал, мне хотелось бы создавать листы с нужным мне содержимым видового экрана, либо клонировать один и указывать что именно он будет отображать. Я Инженер по ВК со стажем почти 20 лет и вот эта рутина когда надо чертежи раскладывать по листам очень удручает.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 30-03-2022, 17:21:50
У Layout есть метод CopyFrom. Так что создаёшь новый Layout и копируешь из старого. Высота и ширина должны сохранится, а тебе нужно поменять только свойство Center.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 30-03-2022, 17:26:22
Собственно говоря у тебя в строке:
Код - vb.net [Выбрать]
  1. CadVport = CadDoc.PaperSpace.AddPViewport(CadCenter, 420, 297)
следует задать правильный CadCenter, который бы указывал на центр вида в ModelSpace. Да и не 420 и 297 должно быть, а ширина и высота листа в ModelSpace, а не на бумаге.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 30-03-2022, 17:36:42
CopyFrom я находил по моему даже на этом форуме, но и там решилось всё созданием просто нового Layout с указанием индекса.

"только свойство Center" вот тут то собака и зарыта, изменением свойства Center я двигаю область печати но в Layout, то есть белый контур который выводится на печать, но ни как не содержимое которое должно выводиться на печать. Поэтому в коде я вхожу в редактирование модели через область листа, а вот дальше к кому обратиться не знаю.

Как вариант (я тоже так делаю - руками) тут тоже встречалось, что я растягиваю рамку до нужных размеров в сторону (что бы нужная область чертежа попала в видовой экран) и потом видовой экран возвращаю на "белый лист" для печати.
http://www.normativ.go.kg/organ/%d0%9b%d0%b8%d1%81%d1%82%d1%8b.dwg (http://www.normativ.go.kg/organ/%d0%9b%d0%b8%d1%81%d1%82%d1%8b.dwg) не нашёл как загрузить файл
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 30-03-2022, 17:39:12
следует задать правильный CadCenter, который бы указывал на центр вида в ModelSpace. Да и не 420 и 297 должно быть, а ширина и высота листа в ModelSpace, а не на бумаге.
Получается я на листе создаю PViewport не где мне заблагорассудится, а именно там где у меня в модели находится нужное содержимое. Размер листа верен тут тысячный масштаб и печать один к одному, с этим проблем нет
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 30-03-2022, 17:44:33
Получается я на листе создаю PViewport не где мне заблагорассудится, а именно там где у меня в модели находится нужное содержимое.
Это вопрос или утверждение?
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 30-03-2022, 17:57:34
Это вопрос или утверждение?
Это вопрос. Сегодня уже не проверю, завтра попробую и отпишу. Скорее всего это решение так как у меня первый лист встаёт идеально, потому что он совпадает координатами с моделью. Блин я неделю рыл и книгу уже Полищюка (тут нашёл ссылку) штудировал. Пока спасибо, по результатам отпишу и наверное закину разкомментированный код - хоть я самоучка, но реально мало информации по этому делу.
По поводу CopyFrom если попадётся пример кода скиньте пожалуйста
Спасибо Вам за помощь.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 31-03-2022, 14:34:52
Код - vb.net [Выбрать]
  1. CadCenter(0) = 210 : CadCenter(1) = 148.5 : CadCenter(2) = 0
  2. CadVport = CadDoc.PaperSpace.AddPViewport(CadCenter, 420, 297)
  3.  
  4. CadCenter(0) = 630 : CadCenter(1) = 148.5 : CadCenter(2) = 0
  5. CadVport = CadDoc.PaperSpace.AddPViewport(CadCenter, 420, 297)
  6.  
  7. CadCenter(0) = 210 : CadCenter(1) = -148.5 : CadCenter(2) = 0
  8. CadVport = CadDoc.PaperSpace.AddPViewport(CadCenter, 420, 297)
  9.  
  10. CadCenter(0) = 630 : CadCenter(1) = -148.5 : CadCenter(2) = 0
  11. CadVport = CadDoc.PaperSpace.AddPViewport(CadCenter, 420, 297)
Нет чего то не хватает.
(https://i.postimg.cc/gwPfbPTs/2022-03-31-173119.png) (https://postimg.cc/gwPfbPTs)
Вот так выглядит в модели и что бы не засорять я все скрины не буду скидывать, но кроме того что видовой экран не в печатаемой области, так ещё и видит он одну и ту же область чертеж, номер один только на месте.
(https://i.postimg.cc/QKstFPCJ/2022-03-31-173309.png) (https://postimg.cc/QKstFPCJ)
Ну и соответственно третий лист стоит под белой областью, а четвёртый по диагонали, но отображают все только рамку номер 1 из чертежа.

С перемещение белой области решил с помощью CadLayot.SetWindowToPlot, а вот с областью печати уже вторую неделю бьюсь
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 31-03-2022, 16:57:28
У меня нет возможности сейчас проверять, поэтому попробую в виде рекомендации:
1. Создаёшь лист
2. Создаешь видовой экран в листе.
3. Переключаешься в пространство модели внутри листа.
4. Выполняешь ZoomCenter с центром в центре твоего прямоугольника в модели (можно также попробовать и ZoomWindow)
Главное, что пункт 4. следует выполнять в пространстве модели:
Код - Visual Basic [Выбрать]
  1. ThisDrawing.ActiveSpace = acPaperSpace
  2. ThisDrawing.mspace = True
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 31-03-2022, 18:18:01
Код - vb.net [Выбрать]
  1. CadDoc.MSpace = True ' вошёл в редактирование модели в окне листа
  2. ' скорее всего не сработает, потом удали
  3. CadVP = CadDoc.Viewports.Item(0) ' CadDoc.ActiveViewport не находит вид
  4. XY1(0) = grdList.Rows(X).Cells(8).Value : XY1(1) = grdList.Rows(X).Cells(9).Value
  5. CadVP.Center = XY1

(https://i.postimg.cc/Y4gZns8B/1.jpg) (https://postimg.cc/Y4gZns8B)

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

На слово Zoom нет вариантов.

Пробовал создать экран сразу на все возможные листы (думал в крайнем случае потом руками подгоню) но центр видового экрана как будто где то в чертеже прописан - я изменял все вводимые цифры.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 31-03-2022, 18:28:05
На слово Zoom нет вариантов.
Плохо искал: https://help.autodesk.com/view/OARX/2019/FRA/?guid=GUID-16BDEA18-4555-4EA7-A426-9A9E5683AC9B
Должно быть как-то так:
Код - vb.net [Выбрать]
  1. CadDoc.MSpace = True
  2. CadDoc.Application.ZoomCenter(XY1,1.0) ' Возможно масштаб потребуется изменить.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 31-03-2022, 18:59:50
Вы просто гуру, не понятно почему масштаб видового экрана становится 297, но дело поправимое, к сожалению не вижу кнопку "Решение", ну и по результатам тестов и упорядочивания кода - закину. Я просто рыл в сторону View, а оказалось в Application.ZoomCenter, да и избегаю я API так как это привязка в библиотеке - хотя вроде уже не такая жёсткая как раньше
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 31-03-2022, 19:37:27
Вы просто гуру, не понятно почему масштаб видового экрана становится 297
Можешь тогда попробовать вместо ZoomCener:
Код - Visual Basic [Выбрать]
  1. CadDoc.Application.ZoomWindow(pt1, pt2)
где pt1 - нижняя левая точка прямоугольника, а pt2 - правая верхняя точка прямоугольника.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 31-03-2022, 19:39:03
к сожалению не вижу кнопку "Решение"
Эта кнопка есть только у автора темы, и у модераторов/администраторов. При этом может быть только одно "Решение" в теме.
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 31-03-2022, 20:57:00
Код - vb.net [Выбрать]
  1. CadDoc.MSpace = True
  2. CadDoc.Application.ZoomCenter(XY1,1.0) ' Возможно масштаб потребуется изменить.
Тогда это решение, ну а я постараюсь собрать код и закину, сейчас работать надо, не когда кодить, потом соберу и закину в тему, реально в просторах инета нет решения по этому поводу
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: D_TRex от 31-03-2022, 21:07:31
Я ранее пробовал кодить, но потом решил, внутрянка МЕР, сети Civil, надо шейпы собрать МАР, надо карту с грубыми горизонталями Infraworks и бросил я идею программирования, а кто-то знает где библиотеки и чем вскрыть вышеперечисленных программ? Короче не хватает вот этого счастья "как я сегодня получил глядя на создание листов" вот таким же манером вскрыть системные папки када и поправить под себя. Тема офтоп, но курилки не видел
Название: Re: Как программно задать видовому экрану именованный вид?
Отправлено: Александр Ривилис от 31-03-2022, 21:14:11
Тема офтоп, но курилки не видел
Курилка здесь: https://adn-cis.org/forum/index.php?board=44.0