VBA for ACAD |
Здравствуйте, гость ( Вход | Регистрация )
Here You Can Support Our Work and .:LavTeaM:. Services |
VBA for ACAD |
5.05.2009 - 15:31
Сообщение
#21
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
|
|
|
5.05.2009 - 15:39
Сообщение
#22
|
|
Свой человек Группа: Пользователи Пользователь №: 9904 Сообщений: 652 Регистрация: 31.01.2005 Из: С.-Петербург Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 36 раз(а) |
Под подобные приложения вообще тяжело что бы то ни было пишется. Мне в свое время пришлось "забирать" данные с объектов СПДС 4.0, вот я тогда порадовался, что сделал ставку на лисп... Другими методами добраться до значений тех же узловых выносок было никак невозможно. Ну или использовать C++ / C# / VB.NET и работать уже глубоко внутри ядра. А это надо время учиться, которого мне никто не выделял
Ладно, это лирика. А по поводу SendCommand... Я бы, наверное, сделал так: 1. На лиспе пишется нечто типа Код (defun execute-command (cmdname) (command cmdname) (while (/= (getvar "cmdactive") 0) (command pause) );_ end of while );_ end of defun 2. Полученный файл загружается в текущий чертеж (любым из доступных методов) 3. В VBA выполняется нечто типа Код ThisDrawing.SendCommand "(execute-command " & Chr(34) & ИмяВыполняемойКоманды & Chr(34) & ")" & vbCr Только учти, что я подобными играми занимался примерно года три назад, с тех пор так ни разу и не пригодилось. Так что работоспособность метода под бааальшим вопросом. |
|
|
5.05.2009 - 16:01
Сообщение
#23
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
я отправляю
Цитата ThisDrawing.SendCommand "magiexp" & vbCr & "все" & vbCr & vbCr перед этим делаю Hide, а потом уже обработка набора... но если не ввести столько вводов, то сначало обработается набор, а потом уже команда выполнится, а я хочу, чтобы пока в командной строке не появилось "Команда", макрос бы не выполнялся... |
|
|
5.05.2009 - 17:45
Сообщение
#24
|
|
Свой человек Группа: Пользователи Пользователь №: 9904 Сообщений: 652 Регистрация: 31.01.2005 Из: С.-Петербург Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 36 раз(а) |
Пойми, я лисповик Посему и решение предлагаю "хоть чутка поближе к себе"
Код (defun execute-magiexp () А в остальном как и было раньше сказано..
(command magiexp "" "_all" "" "") (while (/= (getvar "cmdactive") 0) (command pause) );_ end of while );_ end of defun |
|
|
6.05.2009 - 15:07
Сообщение
#25
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
Крыс, а не знаешь как определить количество листов в четреже, в листах количество ВЭ, а потом работать с ВЭ?
|
|
|
6.05.2009 - 15:26
Сообщение
#26
|
|
Свой человек Группа: Пользователи Пользователь №: 9904 Сообщений: 652 Регистрация: 31.01.2005 Из: С.-Петербург Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 36 раз(а) |
Количество листов:
Код ThisDrawing.Layouts - 1 Если надо получать все ВЭ, то либо идти через SelectionSet, либо пробовать нечто типа Код Function GetAllViewPorts() As Variant Dim Res() As Object Dim oLayout As AcadLayout, oEnt As AcadEntity For Each oLayout In ThisDrawing.Layouts If Not (UCase(oLayout.Name) Like "*[*]") Then On Error GoTo lErrorReDim For Each oEnt In oLayout.Block If oEnt.ObjectName = "AcDbViewport" Then ReDim Preserve Res(UBound(Res) + 1) Set Res(UBound(Res)) = oEnt End If Next oEnt End If Next oLayout GetAllViewPorts = Res Exit Function lErrorReDim: ReDim Res(0) Resume Next End Function Sub Test() Dim arVP As Variant arVP = GetAllViewPorts End Sub Код я на корректность результата не проверял - тупо некогда |
|
|
6.05.2009 - 16:28
Сообщение
#27
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
If Not (UCase(oLayout.Name) Like "*[*]") Then что эта чтрочка означает?
-может на по асе лучше, если ты согласен а то двоем, не удобно как то |
|
|
6.05.2009 - 17:56
Сообщение
#28
|
|
Свой человек Группа: Пользователи Пользователь №: 9904 Сообщений: 652 Регистрация: 31.01.2005 Из: С.-Петербург Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 36 раз(а) |
Эта строчка означает, что в имени Layout'а не должно быть последней звездочки. Например, пространство модели (кстати, тоже Layout, тоже имеет внутри себя Viewport) имеет имя *Model_Space*; коллекция пространств листа - *Paper_Space*. Для полной гарантии просто тупо исключил из обработки
Насчет аськи... У меня сейчас предотпускная свистопляска, нормально пообщаться точно не удастся. А так-то, стучись, конечно. |
|
|
7.05.2009 - 10:09
Сообщение
#29
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
строчка For Each oLayout In ThisDrawing.Layouts мне понятка,
а вот какая выбирает ВЭ? если "oEnt As AcadEntity", где AcadEntity - все ВЭ... то я такого в хелпе не наше... может AcadViewport? или я запутался? |
|
|
7.05.2009 - 10:16
Сообщение
#30
|
|
Свой человек Группа: Пользователи Пользователь №: 9904 Сообщений: 652 Регистрация: 31.01.2005 Из: С.-Петербург Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 36 раз(а) |
Попробуем так:
Код For Each oLayout In ThisDrawing.Layouts 'По каждому объекту пространства в коллекции пространств
If Not (UCase(oLayout.Name) Like "*[*]") Then ' Если имя не содержит символа "*" On Error GoTo lErrorReDim ' Ну, это обработчик ошибок, ничего нестандартного For Each oEnt In oLayout.Block ' По каждому объекту внутри пространства. Пофигу какому - объект есть, его обрабатываем If oEnt.ObjectName = "AcDbViewport" Then 'Если имя объекта AcDbViewport, т.е. объект является ВЭ ReDim Preserve Res(UBound(Res) + 1) 'В массив результатов добавить 1 элемент Set Res(UBound(Res)) = oEnt 'И только что добавленному элементу массива присвоить указатель на обрабатываемый примитив End If Next oEnt End If Next oLayout |
|
|
7.05.2009 - 11:45
Сообщение
#31
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
тогда как его сделать активным...
а если два ВЭ, то имена у них одинаковые? |
|
|
7.05.2009 - 11:47
Сообщение
#32
|
|
Свой человек Группа: Пользователи Пользователь №: 9904 Сообщений: 652 Регистрация: 31.01.2005 Из: С.-Петербург Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 36 раз(а) |
Стоп. У видового экрана, по-моему, нет понятия имени. Указатель - есть. Координаты - есть. Имя объекта - есть (если честно, то оно у любого примитива есть).
А как ты вообще собираешься "понимать", какой ВЭ надо активизировать? |
|
|
7.05.2009 - 11:53
Сообщение
#33
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
А как ты вообще собираешься "понимать", какой ВЭ надо активизировать? можно разбить "Model" на несколько "подэкранов", но это не то, мне надо поработать на Листах, в коротых будут ВЭ и не один... AcadViewport - как раз обрабатывает ВЭ на моделе, мне так показалось... --- вот пример нашел... ща забацаю... Цитата Sub Example_ActivePViewport()
Dim newPViewport As AcadPViewport Dim centerPoint(0 To 2) As Double Dim height As Double Dim width As Double height = 5# width = 5# centerPoint(0) = 5#: centerPoint(1) = 5#: centerPoint(2) = 0# ' Создайте в пространстве листа объект Viewport ThisDrawing.ActiveSpace = acPaperSpace Set newPViewport = ThisDrawing.PaperSpace.AddPViewport(centerPoint, width, height) ZoomAll newPViewport.DISPLAY (True) ' Перед созданием в пространстве листа активного Viewport, ' свойство mspace должно быть True ThisDrawing.mspace = True ThisDrawing.ActivePViewport = newPViewport End Sub Сообщение отредактировал Agens - 7.05.2009 - 12:24 |
|
|
7.05.2009 - 12:27
Сообщение
#34
|
|
Свой человек Группа: Пользователи Пользователь №: 9904 Сообщений: 652 Регистрация: 31.01.2005 Из: С.-Петербург Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 36 раз(а) |
Так это создание ВЭ. А не активация уже существующего. Немного другая задача, мне кажется.
|
|
|
11.05.2009 - 08:09
Сообщение
#35
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
Все написал... Модуль умеет скать все листы, находить на них ВЭ и активировать их по очереди... активируя производить операцию внутри ВЭ...
|
|
|
11.05.2009 - 09:40
Сообщение
#36
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
блин, на PaperSpace два ВЭ, а AcDbViewport_ов 5... ? что еще может прнниматься за AcDbViewport, внешняя ссылка, вставленная поверх ВЭ может? как ее отсеять от ВЭ, т.к. ее нельзя сделать Active?
|
|
|
11.05.2009 - 19:28
Сообщение
#37
|
|
Свой человек Группа: Пользователи Пользователь №: 9904 Сообщений: 652 Регистрация: 31.01.2005 Из: С.-Петербург Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 36 раз(а) |
А что получается, если идти через SelectionSet?
Кстати, какова общая задача? Может, и без активации ВЭ можно обойтись? |
|
|
12.05.2009 - 13:21
Сообщение
#38
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
все получилось... просто надо было добавить
Цитата On Error Resume Next вот текст, который у меня получился (модуль перебирает все листы в чертеже, в каждом листе делает активными все ВЭ по очереди... Цитата Private Sub {name}_Click()
{forms}.Hide Dim Layout As AcadLayout Dim I, II As Integer For I = 1 To ThisDrawing.Layouts.Count - 1 For II = 0 To ThisDrawing.Layouts.Item(I).Block.Count - 1 If ThisDrawing.Layouts.Item(I).Block.Item(II).ObjectName = "AcDbViewport" Then ThisDrawing.ActiveLayout = ThisDrawing.Layouts.Item(I) ThisDrawing.Layouts.Item(I).Block.Item(II).Display (True) ThisDrawing.MSpace = True On Error Resume Next ThisDrawing.ActivePViewport = ThisDrawing.Layouts.Item(I).Block.Item(II) ThisDrawing.SendCommand {команда автокада или несколько} End If Next ThisDrawing.MSpace = False Next End Sub Сообщение отредактировал Agens - 12.05.2009 - 13:27 |
|
|
12.05.2009 - 13:31
Сообщение
#39
|
|
Свой человек Группа: Пользователи Пользователь №: 9904 Сообщений: 652 Регистрация: 31.01.2005 Из: С.-Петербург Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 36 раз(а) |
Я почти уверен, что можно обойтись без SendCommand и просто менять либо ViewPort, либо пространство модели, на которое он (ВЭ) указывает...
|
|
|
13.05.2009 - 11:06
Сообщение
#40
|
|
Завсегдатай Группа: Пользователи Пользователь №: 89781 Сообщений: 104 Регистрация: 28.04.2008 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
Я почти уверен, что можно обойтись без SendCommand и просто менять либо ViewPort, либо пространство модели, на которое он (ВЭ) указывает... сенд команд это просто можно убрать - это уже специфическая команда выполняется... --- Крыс, ты не знаешь как можно просто комбобокс отсортировать? может команда есть какая? Сообщение отредактировал Agens - 13.05.2009 - 12:10 |
|
|
Текстовая версия | Сейчас: 19.04.2024 - 05:57 |