Тема: Угол между World UCS и local UCS
Подскажите пожалуйсто есть ли в VBA функция либо системная переменная для определения угла на который повёрнуто локальный UCS относительно World UCS.
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → VBA → Угол между World UCS и local UCS
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите пожалуйсто есть ли в VBA функция либо системная переменная для определения угла на который повёрнуто локальный UCS относительно World UCS.
> Алексей
Ты всегда знаешь вектор мировой системы
координат, напр. XDir (1 0 0)
тогда в новой системе координат (она должна
быть обязательно поименована)
set nucs = ThisDrawing.ActiveUCS
смотришь свойства
или
можно получить вектор сразу:
xvec =ThisDrawing.GetVariable("UCSXDIR")
сравниваешь с мировым
Где-то так, если не ошибаюсь
~'J'~
Ув. Fatty спасибо за помощь вот удалось с вашей помощью и helpom Cada добиться чтобы блоки проставлялись по системе координат пользователя. Всё работает так как и было задумано, но заметил один глюк - если система координат пользователя повёрнута на какой либо угол, то макрос (при transform by) вставляет блоки в системе координат с углом два раза большим чем в актуальной сист. коорд. Может сможете подсказать в чем проблемма. Спасибо.
вот код, я его не до конца еще отредактировал так что некоторые ыещи здесь есть ненужные.
Option Explicit Public Sub ExportBlocks() Dim vertlist1() As Double Dim vertlist3(0 To 2) As Double Dim objApp As AcadApplication Dim objDoc As AcadDocument Dim RowCount As Integer Dim RowCount1 As Integer Dim strPrmpt As String Dim intCnt As Integer Dim intcnt1 As Integer Dim objCell As Object Dim objSheet As Worksheet Dim wykres_1 As AcadLayer Dim i As Integer, a As Integer Dim blok1 As AcadBlock Dim pktwst(0 To 2) As Double Dim poli As AcadPolyline Dim pkt(0 To 29) As Double Dim nowalin As AcadLine Dim blokref As AcadBlockReference Dim blokref1 As AcadBlockReference Dim zazn As AcadSelectionSet Dim alayer As String Dim textst As AcadTextStyle Dim textObj As AcadText Dim text1 As String Dim text2 As String Dim text3 As String Dim insPoint1(0 To 2) As Double Dim insPoint2(0 To 2) As Double Dim insPoint3(0 To 2) As Double Dim atr As AcadAttribute Dim atr1 As AcadAttribute Dim atr2 As AcadAttribute Dim atr3 As AcadAttribute Dim mode As Long Dim prompt As String Dim tag As String Dim prompt1 As String Dim tag1 As String Dim prompt2 As String Dim tag2 As String Dim prompt3 As String Dim tag3 As String Dim height As Double Dim ap(0 To 2) As Double Dim ap1(0 To 2) As Double Dim ap2(0 To 2) As Double Dim ap3(0 To 2) As Double Dim sk As Integer Dim ucsObj As AcadUCS Dim origin(0 To 2) As Double Dim xAxisPoint(0 To 2) As Double Dim yAxisPoint(0 To 2) As Double Dim currUCS As AcadUCS Dim kat As Variant On Error GoTo Err_Control On Error GoTo Koniec Set objSheet = ThisWorkbook.Sheets(1) Set objApp = GetObject(, "AutoCAD.Application") Set objDoc = objApp.ActiveDocument With objDoc Set currUCS = .UserCoordinateSystems.Add( _ .GetVariable("UCSORG"), _ .Utility.TranslateCoordinates(.GetVariable("UCSXDIR"), acUCS, acWorld, 0), _ .Utility.TranslateCoordinates(.GetVariable("UCSYDIR"), acUCS, acWorld, 0), _ "OriginalUCS") End With sk = objDoc.Utility.GetInteger("Input scale for block: ") For Each blok1 In objApp.ActiveDocument.Blocks If blok1.Name = "OKU-tabelka" Then GoTo dalej Next pktwst(0) = 7.5 * 0.001 pktwst(1) = 3 * 0.001 pktwst(2) = 0 Set textst = objDoc.TextStyles.Add("OKU") textst.height = 2 * sk * 0.001 textst.Width = 0.7 textst.fontFile = "simplex.shx" objDoc.ActiveTextStyle = textst pkt(0) = 0 pkt(1) = 0 pkt(2) = 0 pkt(3) = 14.5 * 0.001 pkt(4) = 0 pkt(5) = 0 pkt(6) = 14.5 * 0.001 pkt(7) = 6 * 0.001 pkt(8) = 0 pkt(9) = 0 pkt(10) = 6 * 0.001 pkt(11) = 0 pkt(12) = 0 pkt(13) = 0 pkt(14) = 0 pkt(15) = 0 pkt(16) = 3 * 0.001 pkt(17) = 0 pkt(18) = 14.5 * 0.001 pkt(19) = 3 * 0.001 pkt(20) = 0 pkt(21) = 14.5 * 0.001 pkt(22) = 6 * 0.001 pkt(23) = 0 pkt(24) = 7.5 * 0.001 pkt(25) = 6 * 0.001 pkt(26) = 0 pkt(27) = 7.5 * 0.001 pkt(28) = 0 pkt(29) = 0 height = 2 * 0.001 mode = acAttributeModeNormal ap(0) = (pktwst(0) * 1000 - 6.15) * 0.001 ap(1) = (pktwst(1) * 1000 + 0.55) * 0.001 ap(2) = 0 ap1(0) = (pktwst(0) * 1000 + 0.3) * 0.001 ap1(1) = (pktwst(1) * 1000 + 0.55) * 0.001 ap1(2) = 0 ap2(0) = (pktwst(0) * 1000 - 7.15) * 0.001 ap2(1) = (pktwst(1) * 1000 - 2.55) * 0.001 ap2(2) = 0 ap3(0) = (pktwst(0) * 1000 + 1.43) * 0.001 ap3(1) = (pktwst(1) * 1000 - 2.55) * 0.001 ap3(2) = 0 tag = "Nr pala": prompt = "Nr pala" tag1 = "Przekr. pala": prompt1 = "Przekr. pala" tag2 = "Rzedna pala": prompt2 = "Rz. pala" tag3 = "Dlugosc pala": prompt3 = "Dlug. pala" alayer = "0" objDoc.ActiveLayer = objDoc.Layers.Item(alayer) Set blok1 = objDoc.Blocks.Add(pktwst, "OKU-tabelka") Set poli = blok1.AddPolyline(pkt) Set atr = blok1.AddAttribute(height, mode, prompt, ap, tag, " ") atr.ScaleFactor = 0.7 Set atr1 = blok1.AddAttribute(height, mode, prompt1, ap1, tag1, " ") atr1.ScaleFactor = 0.7 Set atr2 = blok1.AddAttribute(height, mode, prompt2, ap2, tag2, " ") atr2.ScaleFactor = 0.7 Set atr3 = blok1.AddAttribute(height, mode, prompt3, ap3, tag3, " ") atr3.ScaleFactor = 0.7 Set blokref = objDoc.ModelSpace.InsertBlock(pktwst, "OKU-tabelka", 1#, 1#, 1#, 0) blokref.Delete dalej: RowCount1 = objSheet.UsedRange.Rows.Count Dim attvar As Variant Dim objAtt As AcadAttributeReference For i = 1 To RowCount1 - 1 vertlist3(0) = objSheet.Cells(i, 4).Value vertlist3(1) = objSheet.Cells(i, 5).Value vertlist3(2) = objSheet.Cells(i, 6).Value Set wykres_1 = objDoc.Layers.Add("OKU-tabelka-pale") wykres_1.Color = acYellow objDoc.ActiveLayer = wykres_1 Set blokref1 = objDoc.ModelSpace.InsertBlock(vertlist3, "OKU-tabelka", sk, sk, 1#, 0) attvar = blokref1.GetAttributes For a = 0 To UBound(attvar) Set objAtt = attvar(a) Select Case UCase(objAtt.TagString) Case UCase("Nr pala") objAtt.TextString = objSheet.Cells(i, 2).Value Case UCase("Przekr. pala") objAtt.TextString = objSheet.Cells(i, 3).Value Case UCase("Rzedna pala") objAtt.TextString = objSheet.Cells(i, 8).Value Case UCase("Dlugosc pala") objAtt.TextString = objSheet.Cells(i, 10).Value End Select Next a blokref1.Update Dim TransMatrix As Variant TransMatrix = currUCS.GetUCSMatrix() blokref1.TransformBy (TransMatrix) blokref1.Update Next objDoc.Regen acActiveViewport Koniec: Set blokref = Nothing Exit_Here: If Not objApp Is Nothing Then Set objApp = Nothing Set objDoc = Nothing End If Exit Sub Err_Control: MsgBox Err.Description Resume Exit_Here End Sub
> Алексей
Алексей, скинь на мой адрес файл Excel
Не люблю копаться без конкретных данных
~'J'~
Здравствуйте помогите разобраться, вот макрос из helpa A-cada:
Sub Example_ActiveUCS() ' This example returns the current saved UCS (or saves a new one dynamically) ' and then sets a new UCS. ' Finally, it returns the UCS to the previous setting. Dim newUCS As AcadUCS Dim currUCS As AcadUCS Dim origin(0 To 2) As Double Dim xAxis(0 To 2) As Double Dim yAxis(0 To 2) As Double ' Get the current saved UCS of the active document. If the current UCS is ' not saved, then add a new UCS to the UserCoordinateSystems collection If ThisDrawing.GetVariable("UCSNAME") = "" Then ' Current UCS is not saved so get the data and save it With ThisDrawing Set currUCS = .UserCoordinateSystems.Add( _ .GetVariable("UCSORG"), _ .Utility.TranslateCoordinates(.GetVariable("UCSXDIR"), acUCS, acWorld, 0), _ .Utility.TranslateCoordinates(.GetVariable("UCSYDIR"), acUCS, acWorld, 0), _ "OriginalUCS") End With Else Set currUCS = ThisDrawing.ActiveUCS 'current UCS is saved End If MsgBox "The current UCS is " & currUCS.Name, vbInformation, "ActiveUCS Example" ' Create a UCS and make it current origin(0) = 0: origin(1) = 0: origin(2) = 0 xAxis(0) = 1: xAxis(1) = 1: xAxis(2) = 0 yAxis(0) = -1: yAxis(1) = 1: yAxis(2) = 0 Set newUCS = ThisDrawing.UserCoordinateSystems.Add(origin, xAxis, yAxis, "TestUCS") ThisDrawing.ActiveUCS = newUCS MsgBox "The new UCS is " & newUCS.Name, vbInformation, "ActiveUCS Example" ' Reset the UCS to its previous setting ThisDrawing.ActiveUCS = currUCS MsgBox "The UCS is reset to " & currUCS.Name, vbInformation, "ActiveUCS Example" End Sub
проблема всё таже-еслу установим актуальный UCS под каким либо углом и запустим макрос то макрос его повернёт на угол равный значению угла UCS пользователя относительно UCS world хотя должен оставить его без изменений. Но если ввести сист.координат без наклона то всё работает без проблем :/
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → VBA → Угол между World UCS и local UCS
Форум работает на PunBB, при поддержке Informer Technologies, Inc