IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила форума Всем прочитать перед созданием темы!
3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
VBA for ACAD
Agens
сообщение 5.05.2009 - 15:31
Сообщение #21


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



Цитата(kpblc @ 5.05.2009 - 15:14) *
Стоп. А что ты посылаешь в ком.строку? Если набор формировать, то смотри SelectSets.Add (да и так у тебя уже есть аналог; ключи только надо поменять).

ай по одну прогу тут пишу, под Магик... там свои наборы, команды и заморочки...
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
kpblc
сообщение 5.05.2009 - 15:39
Сообщение #22


Свой человек
Иконка группы

Группа: Пользователи
Пользователь №: 9904
Сообщений: 652
Регистрация: 31.01.2005
Из: С.-Петербург
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 36 раз(а)



Под подобные приложения вообще тяжело что бы то ни было пишется. Мне в свое время пришлось "забирать" данные с объектов СПДС 4.0, вот я тогда порадовался, что сделал ставку на лисп... Другими методами добраться до значений тех же узловых выносок было никак невозможно. Ну или использовать C++ / C# / VB.NET и работать уже глубоко внутри ядра. А это надо время учиться, которого мне никто не выделял smile.gif
Ладно, это лирика. А по поводу 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

Только учти, что я подобными играми занимался примерно года три назад, с тех пор так ни разу и не пригодилось. Так что работоспособность метода под бааальшим вопросом.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 5.05.2009 - 16:01
Сообщение #23


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



я отправляю
Цитата
ThisDrawing.SendCommand "magiexp" & vbCr & "все" & vbCr & vbCr

перед этим делаю Hide, а потом уже обработка набора... но если не ввести столько вводов, то сначало обработается набор, а потом уже команда выполнится, а я хочу, чтобы пока в командной строке не появилось "Команда", макрос бы не выполнялся...
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
kpblc
сообщение 5.05.2009 - 17:45
Сообщение #24


Свой человек
Иконка группы

Группа: Пользователи
Пользователь №: 9904
Сообщений: 652
Регистрация: 31.01.2005
Из: С.-Петербург
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 36 раз(а)



Пойми, я лисповик sad.gif Посему и решение предлагаю "хоть чутка поближе к себе" smile.gif
Код
(defun execute-magiexp ()
  (command magiexp "" "_all" "" "")
  (while (/= (getvar "cmdactive") 0)
    (command pause)
    );_ end of while
  );_ end of defun
А в остальном как и было раньше сказано..
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 6.05.2009 - 15:07
Сообщение #25


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



Крыс, а не знаешь как определить количество листов в четреже, в листах количество ВЭ, а потом работать с ВЭ?
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
kpblc
сообщение 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

Код я на корректность результата не проверял - тупо некогда sad.gif
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 6.05.2009 - 16:28
Сообщение #27


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



If Not (UCase(oLayout.Name) Like "*[*]") Then что эта чтрочка означает?
-может на по асе лучше, если ты согласен smile.gif а то двоем, не удобно как то smile.gif
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
kpblc
сообщение 6.05.2009 - 17:56
Сообщение #28


Свой человек
Иконка группы

Группа: Пользователи
Пользователь №: 9904
Сообщений: 652
Регистрация: 31.01.2005
Из: С.-Петербург
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 36 раз(а)



Эта строчка означает, что в имени Layout'а не должно быть последней звездочки. Например, пространство модели (кстати, тоже Layout, тоже имеет внутри себя Viewport) имеет имя *Model_Space*; коллекция пространств листа - *Paper_Space*. Для полной гарантии просто тупо исключил из обработки
Насчет аськи... У меня сейчас предотпускная свистопляска, нормально пообщаться точно не удастся. А так-то, стучись, конечно.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 7.05.2009 - 10:09
Сообщение #29


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



строчка For Each oLayout In ThisDrawing.Layouts мне понятка,
а вот какая выбирает ВЭ? если "oEnt As AcadEntity", где AcadEntity - все ВЭ... то я такого в хелпе не наше...
может AcadViewport? или я запутался?
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
kpblc
сообщение 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
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 7.05.2009 - 11:45
Сообщение #31


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



тогда как его сделать активным...
а если два ВЭ, то имена у них одинаковые?
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
kpblc
сообщение 7.05.2009 - 11:47
Сообщение #32


Свой человек
Иконка группы

Группа: Пользователи
Пользователь №: 9904
Сообщений: 652
Регистрация: 31.01.2005
Из: С.-Петербург
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 36 раз(а)



Стоп. У видового экрана, по-моему, нет понятия имени. Указатель - есть. Координаты - есть. Имя объекта - есть (если честно, то оно у любого примитива есть).
А как ты вообще собираешься "понимать", какой ВЭ надо активизировать?
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 7.05.2009 - 11:53
Сообщение #33


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



Цитата(kpblc @ 7.05.2009 - 11:47) *
А как ты вообще собираешься "понимать", какой ВЭ надо активизировать?

можно разбить "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
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
kpblc
сообщение 7.05.2009 - 12:27
Сообщение #34


Свой человек
Иконка группы

Группа: Пользователи
Пользователь №: 9904
Сообщений: 652
Регистрация: 31.01.2005
Из: С.-Петербург
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 36 раз(а)



Так это создание ВЭ. А не активация уже существующего. Немного другая задача, мне кажется.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 11.05.2009 - 08:09
Сообщение #35


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



Все написал... Модуль умеет скать все листы, находить на них ВЭ и активировать их по очереди... активируя производить операцию внутри ВЭ...
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 11.05.2009 - 09:40
Сообщение #36


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



блин, на PaperSpace два ВЭ, а AcDbViewport_ов 5... ? что еще может прнниматься за AcDbViewport, внешняя ссылка, вставленная поверх ВЭ может? как ее отсеять от ВЭ, т.к. ее нельзя сделать Active?
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
kpblc
сообщение 11.05.2009 - 19:28
Сообщение #37


Свой человек
Иконка группы

Группа: Пользователи
Пользователь №: 9904
Сообщений: 652
Регистрация: 31.01.2005
Из: С.-Петербург
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 36 раз(а)



А что получается, если идти через SelectionSet?
Кстати, какова общая задача? Может, и без активации ВЭ можно обойтись?
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 12.05.2009 - 13:21
Сообщение #38


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 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
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
kpblc
сообщение 12.05.2009 - 13:31
Сообщение #39


Свой человек
Иконка группы

Группа: Пользователи
Пользователь №: 9904
Сообщений: 652
Регистрация: 31.01.2005
Из: С.-Петербург
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 36 раз(а)



Я почти уверен, что можно обойтись без SendCommand и просто менять либо ViewPort, либо пространство модели, на которое он (ВЭ) указывает...
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Agens
сообщение 13.05.2009 - 11:06
Сообщение #40


Из местных
Иконка группы

Группа: Пользователи
Пользователь №: 89781
Сообщений: 99
Регистрация: 28.04.2008
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



Цитата(kpblc @ 12.05.2009 - 13:31) *
Я почти уверен, что можно обойтись без SendCommand и просто менять либо ViewPort, либо пространство модели, на которое он (ВЭ) указывает...

сенд команд это просто можно убрать - это уже специфическая команда выполняется...
---
Крыс, ты не знаешь как можно просто комбобокс отсортировать? может команда есть какая?

Сообщение отредактировал Agens - 13.05.2009 - 12:10
Перейти в начало страницы
Вставить ник
+Цитировать сообщение

3 страниц V  < 1 2 3 >
Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 16.12.2019 - 06:24