| Правила | Регистрация | Пользователи | Поиск | Сообщения за день | Все разделы прочитаны |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сделать сопряжение линии и дуги в vba autocad?

Как сделать сопряжение линии и дуги в vba autocad?

Ответ
Поиск в этой теме
Непрочитано 08.01.2016, 00:20
Как сделать сопряжение линии и дуги в vba autocad?
rusik16
 
Регистрация: 07.01.2016
Сообщений: 6

Доброго времени суток. Помогите решить проблему, все праздники бьюсь над этим. Не могу разобраться как в VBA AUTOCAD сделать сопряжение дуги и линии с заданным радиусом. Спасибо за понимание.

Вложения
Тип файла: dwg
DWG 2010
Чертеж1.dwg (72.1 Кб, 1575 просмотров)

Просмотров: 10708
 
Непрочитано 12.01.2016, 12:30
#21
Puroshev


 
Регистрация: 22.10.2008
Сообщений: 73
Отправить сообщение для Puroshev с помощью Skype™


Макрос для построения того, что хотел автор
Код:
[Выделить все]
Private Sub CommandButton2_Click()
Dim T0 As Variant
Dim objLine1 As AcadLine
   Dim sP(0 To 2) As Double
   Dim eP(0 To 2) As Double

Dim obL1 As AcadLine
Dim obL2 As AcadLine
Dim obL3 As AcadLine

Dim objarc1 As AcadArc
Dim objarc2 As AcadArc
Dim objarc3 As AcadArc
    
    Dim startAngleInRadian As Double
    Dim endAngleInRadian As Double

    Dim centerPoint(0 To 2) As Double
    Dim radius As Double
    Dim startAngleInDegree As Double
    Dim endAngleInDegree As Double
Dim S1 As String
Dim S2 As String
    
'############# ДАННЫЕ #################
'############# ДАННЫЕ #################
'############# ДАННЫЕ #################
'############# ДАННЫЕ #################
'############# ДАННЫЕ #################
'############# ДАННЫЕ #################
    radius = 25# ' сопряжения
    B = 150# ' ширина фигуры
    H = 250# ' высота фигуры (без учета подъема верхнй дуги)
    RD = 125# ' радиус верхней дуги
'############################################################
UserForm1.Hide
    ' Возвратите точку, используя подсказку
    T0 = ThisDrawing.Utility.GetPoint(, "Введите точку: ")
       ' Определяем нижнюю линию
        sP(0) = T0(0) - (B / 2 - radius): sP(1) = T0(1): sP(2) = T0(2)
        eP(0) = T0(0) + (B / 2 - radius): eP(1) = T0(1): eP(2) = T0(2)
    Set obL1 = ThisDrawing.ModelSpace.AddLine(sP, eP)
    ' Определяем левую линию
        sP(0) = T0(0) - B / 2: sP(1) = T0(1) + radius: sP(2) = T0(2)
        eP(0) = T0(0) - B / 2: eP(1) = T0(1) + H: eP(2) = T0(2)
    Set obL2 = ThisDrawing.ModelSpace.AddLine(sP, eP)
    ' Определяем дугу левую нижнюю
        centerPoint(0) = T0(0) - (B / 2 - radius): centerPoint(1) = T0(1) + radius: centerPoint(2) = 0#
        startAngleInDegree = 180#
    endAngleInDegree = -90#
    ' Конвертируйте углы в градусах к углам в радианах
        startAngleInRadian = startAngleInDegree * 3.141592 / 180#
        endAngleInRadian = endAngleInDegree * 3.141592 / 180#
    Set objarc1 = ThisDrawing.ModelSpace.AddArc(centerPoint, radius, startAngleInRadian, endAngleInRadian)
    
    ' Определяем правую линию
        sP(0) = T0(0) + B / 2: sP(1) = T0(1) + radius: sP(2) = T0(2)
        eP(0) = T0(0) + B / 2: eP(1) = T0(1) + H: eP(2) = T0(2)
    Set obL3 = ThisDrawing.ModelSpace.AddLine(sP, eP)
    ' Определяем дугу правую нижнюю
        centerPoint(0) = T0(0) + (B / 2 - radius): centerPoint(1) = T0(1) + radius: centerPoint(2) = 0#
        startAngleInDegree = -90#
    endAngleInDegree = 0#
    ' Конвертируйте углы в градусах к углам в радианах
        startAngleInRadian = startAngleInDegree * 3.14159265358979 / 180#
        endAngleInRadian = endAngleInDegree * 3.14159265358979 / 180#
    Set objarc2 = ThisDrawing.ModelSpace.AddArc(centerPoint, radius, startAngleInRadian, endAngleInRadian)
        ' Определяем дугу верхнюю
        dH = (RD ^ 2 - (B / 2) ^ 2) ^ 0.5
        centerPoint(0) = T0(0): centerPoint(1) = (T0(1) + H) - dH: centerPoint(2) = 0#
        startAngleInRadian = Atn(dH / (B / 2))
        endAngleInRadian = 3.14159265358979 - startAngleInRadian
    Set objarc3 = ThisDrawing.ModelSpace.AddArc(centerPoint, RD, startAngleInRadian, endAngleInRadian)
    objarc3.Update
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


X2L = Format(obL2.endPoint(0), "###0.00")
Y2L = Format(obL2.endPoint(1) - 1, "###0.00")
Z2L = Format(obL2.endPoint(2), "###0.00")

X3L = Format(obL3.endPoint(0), "###0.00")
Y3L = Format(obL3.endPoint(1) - 1, "###0.00")
Z3L = Format(obL3.endPoint(2), "###0.00")


X2A = Format(objarc3.startPoint(0), "###0.00")
Y2A = Format(objarc3.startPoint(1) + 1, "###0.00")
Z2A = Format(objarc3.startPoint(2), "###0.00")

X3A = Format(objarc3.endPoint(0), "###0.00")
Y3A = Format(objarc3.endPoint(1) + 1, "###0.00")
Z3A = Format(objarc3.endPoint(2), "###0.00")

ThisDrawing.SetVariable "FILLETRAD", radius

S1 = "(setq a (LIST (HANDENT " & Chr(34) & CStr(obL2.Handle) & Chr(34) & ") (list " & X2L & " " & Y2L & " " & Z2L & "))) "
S2 = "(setq b (LIST (HANDENT " & Chr(34) & CStr(objarc3.Handle) & Chr(34) & ") (list " & X3A & " " & Y3A & " " & Z3A & "))) "
ThisDrawing.SendCommand S1
ThisDrawing.SendCommand S2
comString = "_FILLET" & vbCr & "!a" & vbCr & "!b" & vbCr
ThisDrawing.SendCommand comString


S1 = "(setq a (LIST (HANDENT " & Chr(34) & CStr(obL3.Handle) & Chr(34) & ") (list " & X3L & " " & Y3L & " " & Z3L & "))) "
S2 = "(setq b (LIST (HANDENT " & Chr(34) & CStr(objarc3.Handle) & Chr(34) & ") (list " & X2A & " " & Y2A & " " & Z2A & "))) "
ThisDrawing.SendCommand S1
ThisDrawing.SendCommand S2
comString = "_FILLET" & vbCr & "!a" & vbCr & "!b" & vbCr
ThisDrawing.SendCommand comString


UserForm1.Show

End Sub
Puroshev вне форума  
 
Непрочитано 12.01.2016, 13:00
#22
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Цитата:
Сообщение от Boxa Посмотреть сообщение
art_rrc, стесняюсь спросить, а Вы пробовали руками сделать то, что написали?
1. Окружность
2. Красные точки с помощью Intersect, подрезка примитивов.
3. По 2м точкам и радиусу дуга. Удаление окружности.

ps На 3м изображении в точности то, что хотел автор в прикрепленном файле dwg в первом посте
Миниатюры
Нажмите на изображение для увеличения
Название: 123.PNG
Просмотров: 46
Размер:	28.9 Кб
ID:	163484  
art_rrc вне форума  
 
Непрочитано 12.01.2016, 13:18
#23
doctorraz

электрик
 
Регистрация: 19.02.2010
Волгоград
Сообщений: 2,295
Отправить сообщение для doctorraz с помощью Skype™


здорово, так просто все получается
Цитата:
Сообщение от art_rrc Посмотреть сообщение
1. Окружность
а каким она радиусом?
Цитата:
Сообщение от art_rrc Посмотреть сообщение
3. По 2м точкам и радиусу дуга. Удаление окружности.
по полученным точкам и радиусу первой окружности получается только для угла 90 град
__________________
Мастерская СПДС
doctorraz вне форума  
 
Непрочитано 12.01.2016, 13:30
#24
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


doctorraz, Тут подробнее http://forum.dwg.ru/showpost.php?p=1491345&postcount=19
art_rrc вне форума  
 
Непрочитано 12.01.2016, 14:40
#25
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от art_rrc Посмотреть сообщение
1. Окружность
2. Красные точки с помощью Intersect, подрезка примитивов.
3. По 2м точкам и радиусу дуга. Удаление окружности.
А теперь еще такую же картинку для острого угла, если не сложно конечно.
Хотя нет, не надо и так все понятно.
Boxa вне форума  
 
Непрочитано 13.01.2016, 09:17
#26
art_rrc


 
Регистрация: 28.01.2013
Минск
Сообщений: 379


Цитата:
Сообщение от Boxa Посмотреть сообщение
А теперь еще такую же картинку для острого угла, если не сложно конечно.
Ну для какого острого угла? Задача ведь не абстрактная, не математическая, не в общем виде. Где вы видели окна с арками вниз?
Автор просил идей, я высказал свою. Я считаю, что она хороша в плане простоты реализации, плоха в плане универсальности, но нужна ли эта универсальность в рамках поставленной задачи? Теперь у автора есть выбор, что ему нужнее.
ps В споре рождается истина.
art_rrc вне форума  
 
Непрочитано 13.01.2016, 10:02
#27
Boxa

КЖ; C#
 
Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,588


Цитата:
Сообщение от art_rrc Посмотреть сообщение
Ну для какого острого угла? Задача ведь не абстрактная, не математическая, не в общем виде. Где вы видели окна с арками вниз?











Цитата:
Сообщение от art_rrc Посмотреть сообщение
Я считаю, что она хороша в плане простоты реализации
Проблема в том, что ваше решение не дает сопряжение. Сопряжение строится на основе касательных, а Ваш алгоритм один, заметный, излом, заменяет парой менее заметных изломов.
Boxa вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > Как сделать сопряжение линии и дуги в vba autocad?

Размещение рекламы
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать непечатаемым текст в ячейке таблицы в Autocad? Газизов Рафаэль AutoCAD 10 02.09.2014 16:51
Что сделать, чтоб при печати были видны линии, пересекающие трубопровод? Dion AutoCAD 8 09.08.2013 23:04
Как сделать сопряжение полилиний в этом случае? neonatyra AutoCAD 6 07.06.2013 11:11
как сделать в листе линии ч/б, чтобы в моделе они оставались цветными natiol AutoCAD 19 18.07.2010 20:35
Вес линии в AutoCAD 2002 CyberMan AutoCAD 5 05.11.2003 22:33