Тема: реализация команды ВЫЧИТАНИЕ (subtract)
Прошу помощи с кодом реализации стандартной команды ВЫЧИТАНИЕ (subtract) к примеру объекта REGION при помощи VBA.
Заранее спасибо!
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → реализация команды ВЫЧИТАНИЕ (subtract)
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Прошу помощи с кодом реализации стандартной команды ВЫЧИТАНИЕ (subtract) к примеру объекта REGION при помощи VBA.
Заранее спасибо!
> Олег
Я тоже не против посмотреть исходники реализации на vba, хотя, для регионов можно и на лиспе...
Если учесть, что из vba нет доступа к 3d ядру, то код обещает быть интересным! Тем более, что автодеск не стал его писать, а купил вместе с 3d ядром на стороне.
Евгений, спасибо... содержательно...
Я начал пытаться писать макросы на VBA. С окружностями, полиниями, регионами, их вращением и вытягиванием все понятно. Но для полного счастья мне необходимо вычитание регионов (твердых тел). На сколько я понял Вас, при помощи VBA эту задачу решить НЕВОЗМОЖНО???
Если это действительно так, то VBА, покрайней мере для меня, не имеет никакого смысла... и на сколько я понял, альтернативы LISP просто нет?
Буду рад, если я ошибаюсь и VBA все же полноценное приложение к AutoCAD'у
> Олег
Я не говорил, что невозможно!
Все возможно...
Могу предложить два пути
1. использовать уже реализованные возможности автокада, т.е. через объектную модель автокада, либо командную строку..
Кстати, в объектной модели, есть булевые операции.
object.Boolean(Operation, Object) - смотри справку
2. Написать свою реализацию необходимых действий. Для своего проекта, я написал полный комплект программ, для всех булевых операций с моими деталями. Я так обозвал блоки, внутри которых внешние и внутренние полилинии, штриховки, текст...
Но выложить эти программы на форум, я не могу.
Олег, не мог бы ты выложить программу на VBA для реализации функции выдавливания?
Заранее спасибо.
Вот интересно, почему не нашлось в справке вот это:
Sub Ch4_CreateCompositeRegions() ' Create two circles, one representing a room, ' the other a pillar in the center of the room Dim RoomObjects(0 To 1) As AcadCircle Dim center(0 To 2) As Double Dim radius As Double center(0) = 4 center(1) = 4 center(2) = 0 radius = 2# Set RoomObjects(0) = ThisDrawing.ModelSpace. _ AddCircle(center, radius) radius = 1# Set RoomObjects(1) = ThisDrawing.ModelSpace. _ AddCircle(center, radius) ' Create a region from the two circles Dim regions As Variant regions = ThisDrawing.ModelSpace.AddRegion(RoomObjects) ' Copy the regions into the region variables for ease of use Dim RoundRoomObj As AcadRegion Dim PillarObj As AcadRegion If regions(0).Area > regions(1).Area Then ' The first region is the room Set RoundRoomObj = regions(0) Set PillarObj = regions(1) Else ' The first region is the pillar Set PillarObj = regions(0) Set RoundRoomObj = regions(1) End If ' Subtract the pillar space from the floor space to ' get a region that represents the total carpet area. [b] RoundRoomObj.Boolean acSubtraction, PillarObj[/b] ' Use the Area property to determine the total carpet area MsgBox "The carpet area is: " & RoundRoomObj.Area End Sub
Boolean Method
Performs a Boolean operation (union, intersect, or subtract) between the object and another 3DSolid or Region object.
Signature
object.Boolean(Operation, Object)
Object : 3DSolid, Region : The object or objects this method applies to.
Operation : AcBooleanType enum; input-only
- acUnion: Performs a union operation.
- acIntersection: Performs an intersection operation.
- acSubtraction: Performs a subtraction operation.
Object
Object; input-only : The object the operation is performed against.
Remarks : The first object is modified as a result of the operation.
NOTE If there is no result from the operation, the first object is not changed. For example, when finding the intersection between two non-intersecting objects, there is no change to the first object.
> Санков Андрей
Если я правильно понял, то тебя интересует это:
Private Sub CommandButton1_Click() Dim L_g As Double Dim D_s As Double Dim D_b As Double 'необходимо присвоить значения величинам, указанным выше. Например L_g=900 D_s=125 D_b=200 'чертим полинию... немного сложный профиль для примера, но извините - взято из моего макроса Dim p_1(0 To 17) As Double p_1(0) = 0: p_1(1) = (D_s / 2 - 1) p_1(2) = 0: p_1(3) = D_s / 2 p_1(4) = 50: p_1(5) = D_s / 2 p_1(6) = 50: p_1(7) = D_b / 2 p_1(8) = (50 + L_g): p_1(9) = D_b / 2 p_1(10) = (50 + L_g): p_1(11) = D_s / 2 p_1(12) = (50 + L_g + 50): p_1(13) = D_s / 2 p_1(14) = (50 + L_g + 50): p_1(15) = (D_s / 2 - 1) p_1(16) = 0: p_1(17) = (D_s / 2 - 1) Dim qqq(0 To 0) As AcadLWPolyline Set qqq(0) = ThisDrawing.ModelSpace.AddLightWeightPolyline(p_1) 'чертим регион по полинии Dim regionObj As Variant regionObj = ThisDrawing.ModelSpace.AddRegion(qqq) 'собственно вытягиваем регион Dim solidObj As Acad3DSolid Set solidObj = ThisDrawing.ModelSpace.AddExtrudedSolid(regionObj(0), 1000, 0) ZoomAll Dim NewDirection(0 To 2) As Double NewDirection(0) = -1: NewDirection(1) = -1: NewDirection(2) = 1 ThisDrawing.ActiveViewport.Direction = NewDirection ThisDrawing.ActiveViewport = ThisDrawing.ActiveViewport ZoomAll 'удаляем уже ненужную полинию и регион qqq(0).Delete regionObj(0).Delete End Sub
> Кулик Алексей aka kpblc
Спасибо за оперативный отклик.
Вижу, что Ваш код - это реальный ответ на мой вопрос. Буду разбираться. Действительно, почему-то в хелпе этот пример не был мною обнаружен...
У меня к Вам еще один вопрос - реализация команды ОБЪЕДИНЕНИЕ (union) двух твердых тел. Буду премного благодарен!
Всех с наступающим Новым годом!
Ну Семен Семеныч...
Там же, те же: object.Boolean acUnion, <object>
Я ж не зря описание метода Boolean привел...
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → реализация команды ВЫЧИТАНИЕ (subtract)
Форум работает на PunBB, при поддержке Informer Technologies, Inc