Тема: реализация команды ВЫЧИТАНИЕ (subtract)

Прошу помощи с кодом реализации стандартной команды ВЫЧИТАНИЕ (subtract) к примеру объекта REGION при помощи VBA.
Заранее спасибо!

Re: реализация команды ВЫЧИТАНИЕ (subtract)

> Олег
Я тоже не против посмотреть исходники реализации на vba, хотя, для регионов можно и на лиспе...
Если учесть, что из vba нет доступа к 3d ядру, то код обещает быть интересным! Тем более, что автодеск не стал его писать, а купил вместе с 3d ядром на стороне.

Re: реализация команды ВЫЧИТАНИЕ (subtract)

Евгений, спасибо... содержательно...
Я начал пытаться писать макросы на VBA. С окружностями, полиниями, регионами, их вращением и вытягиванием все понятно. Но для полного счастья мне необходимо вычитание регионов (твердых тел). На сколько я понял Вас, при помощи VBA эту задачу решить НЕВОЗМОЖНО???
Если это действительно так, то VBА, покрайней мере для меня, не имеет никакого смысла... и на сколько я понял, альтернативы LISP просто нет?
Буду рад, если я ошибаюсь и VBA все же полноценное приложение к AutoCAD'у

Re: реализация команды ВЫЧИТАНИЕ (subtract)

> Олег
Я не говорил, что невозможно!
Все возможно...
Могу предложить два пути
1. использовать уже реализованные возможности автокада, т.е. через объектную модель автокада, либо командную строку..
Кстати, в объектной модели, есть булевые операции.
object.Boolean(Operation, Object) - смотри справку
2. Написать свою реализацию необходимых действий. Для своего проекта, я написал полный комплект программ, для всех булевых операций с моими деталями. Я так обозвал блоки, внутри которых внешние и внутренние полилинии, штриховки, текст...
Но выложить эти программы на форум, я не могу.

Re: реализация команды ВЫЧИТАНИЕ (subtract)

Олег, не мог бы ты выложить программу на VBA для реализации функции выдавливания?
Заранее спасибо.

Re: реализация команды ВЫЧИТАНИЕ (subtract)

Вот интересно, почему не нашлось в справке вот это:

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.

Re: реализация команды ВЫЧИТАНИЕ (subtract)

> Санков Андрей
Если я правильно понял, то тебя интересует это:

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

Re: реализация команды ВЫЧИТАНИЕ (subtract)

> Кулик Алексей aka kpblc
Спасибо за оперативный отклик.
Вижу, что Ваш код - это реальный ответ на мой вопрос. Буду разбираться. Действительно, почему-то в хелпе этот пример не был мною обнаружен...
У меня к Вам еще один вопрос - реализация команды ОБЪЕДИНЕНИЕ (union) двух твердых тел. Буду премного благодарен!
Всех с наступающим Новым годом!

Re: реализация команды ВЫЧИТАНИЕ (subtract)

Ну Семен Семеныч...
Там же, те же: object.Boolean acUnion, <object>
Я ж не зря описание метода Boolean привел...