Тема: Как получить размеры всех или выделеных "solid"ов?
Подскажите как это сделать.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Как получить размеры всех или выделеных "solid"ов?
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите как это сделать.
- создать набор из SOLID'ов
- организовать цикл по обработке элементов набора
- для каждого SOLID'а выбрать координаты вершин и по ним подсчитать размеры
Если можно то хотелось бы немного подробнее, хотя-бы на примере одного.В моем случае тела это параллограммы(панели ДСП).
Вот пример очень упрощенного решения. Так как в задании не сказано, какие именно размеры нужно получить и к тому же есть ссылка на панели ДСП, я исходил из предположения, что определяем размеры прямоугольников расположенных параллельно осям координат.
Sub SelSolid() ' Create the selection set Dim ssetObj As AcadSelectionSet Set ssetObj = ThisDrawing.ActiveSelectionSet Dim gpCode(0) As Integer Dim dataValue(0) As Variant gpCode(0) = 0 dataValue(0) = "SOLID" Dim groupCode As Variant, dataCode As Variant groupCode = gpCode dataCode = dataValue ssetObj.SelectOnScreen groupCode, dataCode Dim vSolid As AcadSolid Dim X_Size As Double Dim Y_Size As Double On Error Resume Next For Each vSolid In ssetObj MsgBox "X = " & Get_X(vSolid) MsgBox "Y = " & Get_Y(vSolid) Next vSolid End Sub Private Function Get_X(vSolid As AcadSolid) As Double Dim Coord As Variant Dim X_Size As Double Coord = vSolid.Coordinates X_Size = Coord(3) - Coord(0) Get_X = X_Size End Function Private Function Get_Y(vSolid As AcadSolid) As Double Dim Coord As Variant Dim Y_Size As Double Coord = vSolid.Coordinates Y_Size = Coord(4) - Coord(1) Get_Y = Y_Size End Function
В общем случае необходима дополнительная обработка значений координат, но для этого нужно точнее знать условия задачи.
Однако построение программы остается таким же.
Я только учусь програмировать, мне так и не удалось запустить эту программу. Не создаётся набор "Solid"ов.
Мне кажется что это из за того что у меня AutoCad 2005 русофицирован, по этому не совпадает тип объекта.
Катюша, для ДСП есть готовое решение:
см. www.mebelsoft.com/dsp.htm
Спасибо за ссылку но я хочу научиться писать программы сама, лучше помогите разобраться с фильтрами. Не работает FilterData "solid".
Я этот велосипед лет эдак 5 назад уже изобрел :)
> Катюша
Не знаю в чем причина, но русификация Автокада
здесь явно ни при чем, его как не русифицируй, изнутри он все равно английский...
Как именно не работает фильтр? Какая ошибка выскакивает? А наличествуют ли SOLID'ы в чертеже?
С фильтром разобралась работает "3DSOLID".
Теперь не работает :
On Error Resume Next
For Each vSolid In ssetObj
MsgBox "X = " & Get_X(vSolid)
MsgBox "Y = " & Get_Y(vSolid)
Next vSolid
End Sub
Private Function Get_X(vSolid As AcadSolid) As Double
Dim Coord As Variant
Dim X_Size As Double
Coord = vSolid.Coordinates
X_Size = Coord(3) — Coord(0)
Get_X = X_Size
End Function
Private Function Get_Y(vSolid As AcadSolid) As Double
Dim Coord As Variant
Dim Y_Size As Double
Coord = vSolid.Coordinates
Y_Size = Coord(4) — Coord(1)
Get_Y = Y_Size
End Function
Пытаюсь разобраться.
> Катюша
Так у вас не SOLID, a 3DSOLID!
Это же другой компот.
Для начала поменяйте тип примитива в функциях:
Private Function Get_X(vSolid As Acad3DSolid) As Double
Далее надо разобраться с координатами вершин, чтобы получить осмысленный результат.
А я разобралась.
Sub SelSolid()
' Create the selection set
Dim ssetObj As AcadSelectionSet
Set ssetObj = ThisDrawing.ActiveSelectionSet
Dim gpCode(0) As Integer
Dim dataValue(0) As Variant
gpCode(0) = 0
dataValue(0) = "3dSOLID"
Dim groupCode As Variant, dataCode As Variant
groupCode = gpCode
dataCode = dataValue
ssetObj.SelectOnScreen groupCode, dataCode
Dim vSolid As Acad3DSolid
For Each vSolid In ssetObj
vSolid.GetBoundingBox minExt, maxExt
x = maxExt(0) - minExt(0)
y = maxExt(2) - minExt(2)
z = maxExt(1) - minExt(1)
MsgBox "x=" & x & "y=" & y & "z=" & z
Next vSolid
End Sub
> Катюша
А если solid непрямоугольный и непараллельный плоскостям xyz? Или это уже не входит в вашу задачу?:)
Сорьки.. Не прочел весь топик сначала.. Вы ведь изначально имели в виду параллелограмы. (и, скорее всего, лежащие в плоскостях)
Вопрос снят)
> Катюша
А вы проверяли результат прямым измерением на чертеже?
> Сидор Лютый
Вопрос вполне правомерный!
Для деталировки мебели абсолютно нормальный результат, а панели расположеные под углом к плоскостям придется деталировать вручную. Кстати программа которую рекомендовал mebelsoft тоже не обрабатыват такие панели.
Моя обрабатывает ;)
> Сергей
Если не секрет, каким образом?
Если в двух словах, то достигается "минимальный" либо объем либо площадь "боундингбокса". Это кратко ...
Инструменты могут быть разными...
Т.е. получаем оптимальную заготовку для криволинейной детали, на тот случай если деталь "криво" расположена от-но осей координат ...
А я тоже придумала как это сделать. Причем намного проще.
На следующей неделе и моя начнет обрабатывать. И еще учет кромки и разных типов ДСП там будет...
Уважеамый mebelsoft не могли-бы вы скинуть мне исходники своей программы "мини-мебель" в том виде как она сейчас , просто ради любопытства, нераспространение гарантирую.
Заранее благоларю.
varn2006@mail.ru
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Как получить размеры всех или выделеных "solid"ов?
Форум работает на PunBB, при поддержке Informer Technologies, Inc