| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
Поиск в этой теме |
01.03.2007, 03:21 | #1 | |
Выбор объектов в VBA
Геология
П-Камчатский
Регистрация: 22.08.2006
Сообщений: 20
|
||
Просмотров: 9216
|
|
||||
Инженер по автоматизации (строительство) Регистрация: 05.05.2006
Люберцы
Сообщений: 241
|
Код:
|
|||
|
||||
Геология Регистрация: 22.08.2006
П-Камчатский
Сообщений: 20
|
Совсем запутался, может кто поможет.
Вроде все проходит но на выходе когда запускаю в процедуре Set outerLoop(0) = objspase.AddPolyline(point_kk) objhatch.AppendOuterLoop (outerLoop) If vir = False Then objhatch.AppendInnerLoop (innerLoop) End If на команде objhatch.AppendInnerLoop (innerLoop) выдает сообщение: "метод 'FppendInnerloop' of object 'acadHatch2' filed". ладноб ругался на пустой innerLoop, так при полном - та же картинка. :roll: Вроде все проверил, объекты есть (в основном полилинии, но все же замкнутые. Очень срочно, в прочем как всегда Процедура для выбора объектов в квадратной области. по двум точкам. Private Function asdf(t1x As Variant, t1y As Variant, t1z As Variant, t2x As Variant, t2y As Variant, t2z As Variant) As Boolean Dim Sset As AcadSelectionSet, Entry As AcadEntity Dim intcnt As Integer Dim varMax(0 To 2) As Double Dim varMin(0 To 2) As Double varMax(0) = t1x: varMax(1) = t1y: varMax(2) = t1z varMin(0) = t2x: varMin(1) = t2y: varMin(2) = t2z ClearSelectionSets Set Sset = ACADApp.ActiveDocument.SelectionSets.Add("NameSset") Sset.Select acSelectionSetWindow, varMax, varMin intcnt = 0 ReDim innerLoop(1) For Each Entry In Sset ReDim innerLoop(intcnt) Set innerLoop(intcnt) = Entry intcnt = intcnt + 1 Next asdf = IsEmpty(innerLoop(0)) End Function |
|||
|
||||
Инженер по автоматизации (строительство) Регистрация: 05.05.2006
Люберцы
Сообщений: 241
|
Очень долго не разбирался, но одна ошибка налицо:
Код:
Код:
Полилинию проверить на замкнутость элементарно: Код:
Код:
|
|||
|
||||
Геология Регистрация: 22.08.2006
П-Камчатский
Сообщений: 20
|
C точкой пытался, но при попытке считать саму точку с контура или заливки (getbondarybox) у меня выдается ошибка. Не понял по чему, в соседней процедуре, правда на тестовом объекте проходит без запинок. а тут в начале прошло. потом как отрезало, "некорректные данные и все тут. Поспешил. потому и по отдельным цыфрам решил, на этом объекте даже вернее будет.
|
|||
|
||||
Инженер по автоматизации (строительство) Регистрация: 05.05.2006
Люберцы
Сообщений: 241
|
При беглом осмотре криминала, вроде, нет. Нужно смотреть состав innerloop (Shift + F9). Вообще так вслепую довольно тяжело сказать. Да и еще разрыв во времени дело осложняет (я вот только проснулся ) Такое предложение: кинь мне почтой файл (у меня ACAD2006), весь код, и скажи, чего должно получиться, покопаюсь.
|
|||
|
||||
Инженер по автоматизации (строительство) Регистрация: 05.05.2006
Люберцы
Сообщений: 241
|
Вобчем, вот процедура, которая гарантировано возвращает массив замкнутых объектов (тех, что наспех вспомнил) в указанной области. Даже немного подогнал под способ передачи точки в виде трех переменных. А со штриховкой нужно разбираться отдельно.
Код:
|
|||
|
||||
Инженер по автоматизации (строительство) Регистрация: 05.05.2006
Люберцы
Сообщений: 241
|
Штриховка всегда была зело геморройным объектом, и в VBA ситуация не меняется. Я программно со штриховкой до сей поры не работал. Но понял одну вещь: сначала нужно создать объект AcadHatch, затем добавить один замкнутый объект методом AppendOuterLoop. Вот потом можно с ней поизвращаться. И, наконец, чтобы она отобразилась - необходимо вычислить ее методом Evaluate.
Код:
P.P.S. Прилагаю доказательство работоспособности [ATTACH]1173139315.dwg[/ATTACH] |
|||
|
||||
Инженер по автоматизации (строительство) Регистрация: 05.05.2006
Люберцы
Сообщений: 241
|
Блин, вот оно озарение! inner- или outerLoop - это не массив замкнутых объектов! Это один замкнутый объект (точнее - массив из одного объекта), или массив объектов, например отрезков, образующих замкнутый контур! (хелп повнимательней прочел ) Вот почему он выдавал ошибку!
Код:
(чтобы выбирались отрезки в SelectClosedObjects после "AcDbEllipse" добавляем через запятую "AcDbLine") [ATTACH]1173141208.dwg[/ATTACH] |
|||
|
||||
Геология Регистрация: 22.08.2006
П-Камчатский
Сообщений: 20
|
Доброго времени суток!!!
Из-за всех энтих общественных нагрузок взял бы да отменил праздники вовсе. Как праздник, так ни до чего не доберешься. А тут еще сеть накрылась. В общем только сейчас дорвался . У меня рунается на ClearSelectionSets, не понял почему, но это пол беды. Все это работает для ОДНОГО замкнутого объекта. Т.е. если есть четыре взаимопересекающихся отрезка (но замкнтых не на концах а в точках пересечения), то выдается "неверны ввод", то же самое, если в зону попадает хотя бы два замкнтых объеката, независящих друг от друга. в общем теперь нужен способ как то отбирать все эти объекты по одному что ли :roll: . Не понятно как. В одной зоне часто оказываются разные объекты, иногда и не ззамкныте и просто линии, не относящиеся к штриховке. Блин, ну и геморой, в каде то как то это реализовано по одному щелчку мышки!!! p.s. При задании координат совпадающих с объектом для outerloop процедура начинает вносить в список и линии внешнего объекта, что так же ведет к ошибке, как это обойти??? |
|||
|
||||
Инженер по автоматизации (строительство) Регистрация: 05.05.2006
Люберцы
Сообщений: 241
|
Нда, со штриховкой и без VBA геморрою хватало, а тут совсем весело
Такая идея - для пересекающихся отрезков через SendCommand создать контур, и уже этот контур добавлять в innerLoop. Я сделал для нормальных условий (МСК, плоскость XY, вид сверху). Также подкорректировал SelectClosedObject, чтобы не выбирались два замкнутых объекта. Код:
|
|||
|
||||
Инженер по автоматизации (строительство) Регистрация: 05.05.2006
Люберцы
Сообщений: 241
|
Еще мысли по этому поводу: если есть массив с несколькими замкунтыми объектами, то, собственно, проблем никаких: просто в цикле по одному объекту из него добавлять в innerLoop. Только из SelectClosedObject нужно убрать ограничение на (число объектов) = 1.
Код:
|
|||
|
||||
Геология Регистрация: 22.08.2006
П-Камчатский
Сообщений: 20
|
Доброго времени суток!
У меня какой то геморой с командой SendCommand. Тут на многих машинах стоит русский автокад 2006, и он ну ни вкакую непринимает команды на английском, к тому же мой админ вааще предпочел 2005, а у того другой синтаксис ввода команды (там как у тебя "_-BHATCH",, а в 2006 "_BHATCH", т.е. без префикса) и иначе "неизвестная команда". на моем английском компе вроде без проблем. Проверял в свое время именно на BHATCH, но скорее всего будут мелкие проблемки и для boundary. В чем проблема не разбирался, да и значения не имеет, скорее всего просто из-за ломанных версий . Изменить ситуацию с версиями не могу, не я диктую условия, работают кто на чем больше привык, что больше нравится. :wink: Сброшенное тобой вроде заработало (без отрезков), так что решил оставить до лучших времен. А пока просто закрыл отрезки для выбора в массив, поработаю с отдельными объектами. Время совсем поджало, хотел на выходных поработать, да тут как назло два дня пурга была, из дома не выгребся. Обидно, говорят на месте работы только легкий снежок шел. Если все сработает, пущу в обкатку уже сегодня, а то начальство плеш проело. Огромное спасибо за помощь. Самому мне пришлось бы долго разбираться с этим гемороем, если конечно вообще бы разобрался Ну до связи |
|||
|
||||
Инженер по автоматизации (строительство) Регистрация: 05.05.2006
Люберцы
Сообщений: 241
|
Хм. Странно. У меня 2006-й русский, прекрасно понимает и _bhatch и _-bhatch. С отрезками действительно геморрой. Я сделал для случая, когда только одна область, образованная пересекающимися отрезками, да еще пересекающимися краями (чтобы точка пересечения была не дальше середины отрезка). И, опять же, с помощью SendCommand. Ну да ладно, и без них жить можно. Пиши, если что.
|
|||