Тема: Как создать коробку в VBA
Помогите создать в VBA 3d коробку с возможностю задавать габаритные размеры и толщину стенки
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Как создать коробку в VBA
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Помогите создать в VBA 3d коробку с возможностю задавать габаритные размеры и толщину стенки
> alex
Скачивай отсюда:
www.webfile.ru/1110807
~'J'~
Большое спасибо Fatty за то что откликнулся на вопрос . Прогу скачал ,поставил ,а работать она не хочет , пишет "user-defined type not defined " ,может че не так делаю?
Подскажи пожалуста чайнику
> alex
Я пользую АвтоКАД 2005, если у тебя другая версия,
тогда в зайди в редакторе VBA ->Tools->References
и посмотри ссылку на библиотеку AutoCAD 200X Type Library
поменяй там на свою версию
Обычно в таких случаях отсутствующая библиотека
может быть отмечена словом MISSED:
~'J'~
С библиотеками все впорядке
А ставил на AutoCAD2000,2006,2007
Ни на одном не работает
> alex
У меня только 2005
Я позже скину тебе BAS файл, переделаешь в проект сам (послезавтра, возможно)
:(
~'J'~
> alex
Попробую пока на пальцах:
на форме 4 текст бокса и 2 кнопки
боксы:
-Длина
-Ширина
-Высота
-Толщина стенки
Код на форме следующий:
Option Explicit Public ptArr As Variant Public kword As String Public Wid As Double Public Leng As Double Public Hgt As Double Public Thk As Double Public retPnt As Variant Private Sub CommandButton1_Click() Dim Space As AcadBlock Dim objRect1 As AcadLWPolyline Dim objRect2 As AcadLWPolyline Dim objRegion1 As AcadRegion Dim objRegion2 As AcadRegion Dim objSolid1 As Acad3DSolid Dim objSolid2 As Acad3DSolid Me.Hide On Error Resume Next If Err = 0 Then If ThisDrawing.ActiveSpace = acModelSpace Then Set Space = ThisDrawing.ModelSpace Else Set Space = ThisDrawing.PaperSpace End If kword = vbCr & "Specify center point of box:" retPnt = Get_Point(kword) Leng = CDbl(txtLength.Text) Wid = CDbl(txtWidth.Text) Hgt = CDbl(txtHeight.Text) Thk = CDbl(txtThikness.Text) txtLength.Text = "" txtWidth.Text = "" ptArr = Middle_Center_Points(retPnt, Leng, Wid) Dim regObj1 As Variant Dim objArr1(0) As AcadEntity Set objRect1 = Draw_Rectang(Space, ptArr) Set objArr1(0) = objRect1 regObj1 = Space.AddRegion(objArr1) Set objSolid1 = Space.AddExtrudedSolid(regObj1(0), Hgt, 0#) ptArr = Middle_Center_Points(retPnt, Leng - (Thk * 2), Wid - (Thk * 2)) Dim regObj2 As Variant Dim objArr2(0) As AcadEntity Set objRect2 = Draw_Rectang(Space, ptArr) objRect2.Elevation = Thk Set objArr2(0) = objRect2 regObj2 = Space.AddRegion(objArr2) Set objSolid2 = Space.AddExtrudedSolid(regObj2(0), Hgt - Thk, 0#) objSolid1.Boolean acSubtraction, objSolid2 objRect1.Delete objRect2.Delete regObj1(0).Delete regObj2(0).Delete ZoomAll End If CommandButton2.SetFocus CommandButton2.ForeColor = &H40C0& Me.Show End Sub Private Sub CommandButton2_Click() End End Sub Public Function Draw_Rectang(objSpace As AcadBlock, ptArr As Variant) As AcadLWPolyline Dim oPline As AcadLWPolyline Dim acmCol As AcadAcCmColor Set acmCol = New AcadAcCmColor Set oPline = objSpace.AddLightWeightPolyline(ptArr) oPline.Closed = True oPline.Layer = "0" acmCol.ColorIndex = acByLayer oPline.TrueColor = acmCol oPline.LineType = "Continuous" oPline.LinetypeScale = 1# oPline.ConstantWidth = 0# oPline.Update Set Draw_Rectang = oPline End Function Function Get_Point(kword) As Variant ThisDrawing.Utility.InitializeUserInput 128 retPnt = ThisDrawing.Utility.GetPoint(, kword) Get_Point = retPnt End Function Public Function Middle_Center_Points(pickPnt As Variant, Leng As Double, Wid As Double) _ As Variant Dim ptArr(0 To 7) As Double Dim x As Double Dim y As Double x = pickPnt(0) y = pickPnt(1) ptArr(0) = x - Leng / 2: ptArr(1) = y - Wid / 2 ptArr(2) = x + Leng / 2: ptArr(3) = y - Wid / 2 ptArr(4) = x + Leng / 2: ptArr(5) = y + Wid / 2 ptArr(6) = x - Leng / 2: ptArr(7) = y + Wid / 2 Middle_Center_Points = ptArr End Function
~'J'~
За разъяснение большое спасибо!!!!! А можна сделать так чтобы каждая стенка была отдельным элементом ?
> alex
Как вариант:
Нарисуй куб со сторонами 1х1х1
на его основе создай блок "Cub" на слое "0", цвет "ByLayer",
точка вставки центр тяжести
Рисовать в мировой системе координат, вид - "Top"
Без обрабочика ошибок для основной части, в редакторе в меню
Tools->Options-General отметь кнопку "Break on Unhandled Erroes"
Option Explicit Public ptArr As New Collection Public kword As String Public Wid As Double Public Leng As Double Public Hgt As Double Public Thk As Double Public retPnt As Variant Public insPt(2) As Double Dim i As Long Sub DrawBoxCell() Dim Space As AcadBlock Dim obkRef As AcadBlockReference On Error Resume Next If Err = 0 Then If ThisDrawing.ActiveSpace = acModelSpace Then Set Space = ThisDrawing.ModelSpace Else Set Space = ThisDrawing.PaperSpace End If kword = vbCr & "Specify center point of box:" retPnt = Get_Point(kword) Leng = CDbl(InputBox("Enter box length:", "LENGTH")) Wid = CDbl(InputBox("Enter box width:", "WIDTH")) Hgt = CDbl(InputBox("Enter box height:", "HEIGHT")) Thk = CDbl(InputBox("Enter wall thikness:", "THIKNESS")) Set ptArr = Middle_Center_Points(retPnt, Leng, Wid, Thk) insPt(0) = ptArr(1)(0): insPt(1) = ptArr(1)(1): insPt(2) = ptArr(1)(2) Set obkRef = Space.InsertBlock(insPt, "Cub", Thk, Wid - Thk * 2, Hgt, 0#) insPt(0) = ptArr(2)(0): insPt(1) = ptArr(2)(1): insPt(2) = ptArr(2)(2) Set obkRef = Space.InsertBlock(insPt, "Cub", Leng, Thk, Hgt, 0#) insPt(0) = ptArr(3)(0): insPt(1) = ptArr(3)(1): insPt(2) = ptArr(3)(2) Set obkRef = Space.InsertBlock(insPt, "Cub", Thk, Wid - Thk * 2, Hgt, 0#) insPt(0) = ptArr(4)(0): insPt(1) = ptArr(4)(1): insPt(2) = ptArr(4)(2) Set obkRef = Space.InsertBlock(insPt, "Cub", Leng, Thk, Hgt, 0#) ZoomExtents End If End Sub ''~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'' Function Get_Point(kword) As Variant ThisDrawing.Utility.InitializeUserInput 128 retPnt = ThisDrawing.Utility.GetPoint(, kword) Get_Point = retPnt End Function ''~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'' Public Function Middle_Center_Points(pickPnt As Variant, Leng As Double, Wid As Double, Thik As Double) _ As Collection Dim ptArr As New Collection Dim tmp(2) As Double Dim x As Double Dim y As Double x = pickPnt(0) y = pickPnt(1) tmp(0) = x + (Leng - Thik) / 2 tmp(1) = y tmp(2) = 0# ptArr.Add tmp tmp(0) = x tmp(1) = y + (Wid - Thik) / 2 tmp(2) = 0# ptArr.Add tmp tmp(0) = x - (Leng - Thik) / 2 tmp(1) = y tmp(2) = 0# ptArr.Add tmp tmp(0) = x tmp(1) = y - (Wid - Thik) / 2 tmp(2) = 0# ptArr.Add tmp Set Middle_Center_Points = ptArr End Function
~'J'~
А что с "этим" потом делать ?
Как посадить на кнопку?
Куда сохранить созданый куб?
Задача еще актуальна? И именно на VBA нужно писать?
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Как создать коробку в VBA
Форум работает на PunBB, при поддержке Informer Technologies, Inc