Autodesk Community Tips- ADNオープン
Autodesk Community Tipsではちょっとしたコツ、やり方、ショートカット、アドバイスやヒントを共有しています。
ソート順:
質問 Inventor APIで放射状マーキング メニューをカスタマイズする方法はありますか? 回答 APIで放射状マーキング メニューをカスタマイズする方法は2通りあります。 1つ目は、既存のフィーチャーに割り当てられているRadialMarkingMenuを取得し、その内容を編集する方法です。 以下のサンプルは、押し出しフィーチャーに割り当てられているメニューを一旦クリアし、EastControlに計測コマンドを割り当てる例です。Environment.GetRadialMarkingMenu()に指定する引数を変更することで、異なるフィーチャーのRadialMarkingMenuの指定を変えることが可能です。 Dim env As Environment Set env = ThisApplication.UserInterfaceManager.ActiveEnvironment Dim RadialMenu As RadialMarkingMenu Set RadialMenu = env.GetRadialMarkingMenu(ObjectTypeEnum.kExtrudeFeatureObject) RadialMenu.NorthControl = Nothing RadialMenu.NortheastControl = Nothing RadialMenu.NorthwestControl = Nothing RadialMenu.SouthControl = Nothing RadialMenu.SoutheastControl = Nothing RadialMenu.SouthwestControl = Nothing RadialMenu.WestControl = Nothing RadialMenu.EastControl = ThisApplication.CommandManager.ControlDefinitions("AppMeasureDistanceCmd") 2つ目の方法はUserInputEventsのOnRadialMarkingMenuイベントハンドラを利用する方法です。 イベント引数のSelectedEntities に選択状態のエンティティが、RadialMenu にこれから表示されるRadialMarkingMenuが格納されてるので、特定のエンティティの選択状態の場合に、既存のRadialMarkingMenuの定義を一時的(そのイベント内でのみ)書き換えることにより、RadialMenuのコマンドを割り当てを変更する形となります。 以下は、VBAでOnRadialMarkingMenuイベントハンドラを定義し、選択されているエンティティが押し出しである場合に、RadialMarkingMenuを変更するサンプルコードとなります。 ■VBA標準モジュール Dim cls As Class1 Public Sub starEventHandle() Set cls = New Class1 Set cls.uie = ThisApplication.CommandManager.UserInputEvents End Sub ■VBA Class Module(Class1) Public WithEvents uie As UserInputEvents Private Sub uie_OnRadialMarkingMenu(ByVal SelectedEntities As ObjectsEnumerator, ByVal SelectionDevice As SelectionDeviceEnum, ByVal RadialMenu As RadialMarkingMenu, ByVal AdditionalInfo As NameValueMap) If SelectedEntities.Count Exit Sub End If If SelectedEntities(1).Type Exit Sub End If RadialMenu.NorthControl = Nothing RadialMenu.NortheastControl = Nothing RadialMenu.NorthwestControl = Nothing RadialMenu.SouthControl = Nothing RadialMenu.SoutheastControl = Nothing RadialMenu.SouthwestControl = Nothing RadialMenu.WestControl = Nothing RadialMenu.EastControl = ThisApplication.CommandManager.ControlDefinitions("AppMeasureDistanceCmd") End Sub なお、放射状マーキングメニューでは、8方向にコマンドを配置することが可能です。また各方向のメニューは、サブメニューを持つメニューを割り当てることも可能です。 以下は、親のRadialMarkingMenu(変数RadialMenu)のEastControl に対してサブメニューを割り当てる場合のコードです。 Dim subMenu As RadialMarkingMenu Set subMenu = RadialMenu.CreateRadialSubMenu("Vertex Stuff") subMenu.EastControl = ThisApplication.CommandManager.ControlDefinitions("PartPointWorkPointCmd") subMenu.WestControl = ThisApplication.CommandManager.ControlDefinitions("AppSketch3DWrapperCmd") RadialMenu.EastControl = subMenu なお、放射状マーキングメニューの各メニューには、CommandManager.ControlDefinitions()で取得可能なコマンドが指定可能です。 CommandManager.ControlDefinitions()に指定するコマンド名は、以下サンプルコードのようにControlDefinitionsの内容をダンプしたファイルを出力し、ファイル内を検索することで探すことが出来ます。 Public Sub DumpCommands() Open "C:\TEMP\ControlDef.txt" For Append As #1 Dim cd As ControlDefinition For Each cd In ThisApplication.CommandManager.ControlDefinitions Print #1, cd.DisplayName & ":" & cd.ToolTipText & ":"; cd.InternalName Next Close #1 End Sub
記事全体を表示
質問 Inventor APIでコンテンツセンターの言語設定を切り替える方法はありますか? 回答 コンテンツセンターの言語設定を変更するAPIは提供されていません。 ただし、コンテンツセンター画面起動時の言語設定については、C:\Users\\AppData\Roaming\Autodesk\<"Inventor" + version>\Addins配下のAutodesk.ContentCenter.Inventor.addinファイルに、<Language>タグを追加することで設定をすることが出来ます。 <Language _OVERRIDDEN_="ADDED" CCLanguageOverride="de-DE"></Language> <Language>タグ内の属性CCLanguageOverrideの値を変更する(日本語の場合はja-JP、中国語の場合はzh-CN 等)ことにより、コンテンツセンター画面起動時の対象の言語を変更することが出来ます。
記事全体を表示
質問 Inventor APIでアセンブリ、パートファイルの単位数量と基準単位を出力したい 回答 「単位数量」、「基準単位」はBOMQuantityオブジェクトのunitQuantityプロパティ及び、baseUnitsプロパティから取得できます。 なお、これらのプロパティの値は、設定がされていない場合は値が空文字列で取得されます。 以下のVBAサンプルコードは、アセンブリが開いている状態で、そのアセンブリと配下の各ドキュメント(アセンブリ、またはパート)に対して、「単位数量」、「基準単位」、「基準数量」をデバッグウィンドウに出力します。 Public Sub DumpAssemblyBOMQuantity() Dim oAsmDoc As AssemblyDocument Set oAsmDoc = ThisApplication.ActiveDocument Debug.Print oAsmDoc.DisplayName DumpBOMQuantity oAsmDoc.ComponentDefinition Dim oRefDocs As DocumentsEnumerator Set oRefDocs = oAsmDoc.AllReferencedDocuments Dim oRefDoc As Document For Each oRefDoc In oRefDocs Debug.Print oRefDoc.DisplayName DumpBOMQuantity oRefDoc.ComponentDefinition Next End Sub Public Sub DumpBOMQuantity(oCompDef As ComponentDefinition) Dim baseUnits As String Dim unitQuantity As String unitQuantity = oCompDef.BOMQuantity.unitQuantity baseUnits = oCompDef.BOMQuantity.baseUnits Debug.Print "単位数量:" & unitQuantity Debug.Print "基準単位:" & baseUnits Dim quantityType As BOMQuantityTypeEnum Dim quantity As Variant Call oCompDef.BOMQuantity.GetBaseQuantity(quantityType, quantity) If (quantityType = BOMQuantityTypeEnum.kParameterBOMQuantity) Then Dim quantityParameter As Parameter Set quantityParameter = quantity Dim parameterName As String parameterName = quantityParameter.Name Debug.Print "基準数量:" & parameterName ElseIf (quantityType = BOMQuantityTypeEnum.kEachBOMQuantity) Then Debug.Print "基準数量:各" End If End Sub
記事全体を表示
質問 Inventor APIでPDF出力後にPDFを表示しないようにすることは出来ますか? 回答 オプションパラメータ"Launch_Viewer"を指定することで、PDF出力後にPDFを表示 する/しない を制御することが出来ます。 以下はVBAでPDFを出力する際に、「PDFを表示しない」設定を指定するサンプルコードです。 Public Sub PublishPDF() ' Get the PDF translator Add-In. Dim PDFAddIn As TranslatorAddIn Set PDFAddIn = ThisApplication.ApplicationAddIns.ItemById("{0AC6FD96-2F4D-42CE-8BE0-8AEA580399E4}") 'Set a reference to the active document (the document to be published). Dim oDocument As Document Set oDocument = ThisApplication.ActiveDocument Dim oContext As TranslationContext Set oContext = ThisApplication.TransientObjects.CreateTranslationContext oContext.Type = kFileBrowseIOMechanism ' Create a NameValueMap object Dim oOptions As NameValueMap Set oOptions = ThisApplication.TransientObjects.CreateNameValueMap ' Create a DataMedium object Dim oDataMedium As DataMedium Set oDataMedium = ThisApplication.TransientObjects.CreateDataMedium ' Check whether the translator has 'SaveCopyAs' options If PDFAddIn.HasSaveCopyAsOptions(oDocument, oContext, oOptions) Then ' Options for drawings... oOptions.Value("All_Color_AS_Black") = 0 oOptions.Value("Launch_Viewer") = False 'oOptions.Value("Remove_Line_Weights") = 0 'oOptions.Value("Vector_Resolution") = 400 'oOptions.Value("Sheet_Range") = kPrintAllSheets 'oOptions.Value("Custom_Begin_Sheet") = 2 'oOptions.Value("Custom_End_Sheet") = 4 End If 'Set the destination file name oDataMedium.FileName = "c:\temp\test.pdf" 'Publish document. Call PDFAddIn.SaveCopyAs(oDocument, oContext, oOptions, oDataMedium) End Sub
記事全体を表示
質問 Inventor APIでiLogicを実行する方法はありますか? 回答 iLogicのアドインから、IiLogicAutomation COM インターフェイスを介して、Inventorドキュメント内の定義済みのiLogicを実行することが出来ます。 以下は、外部プロセスからVBAを用いて現在起動中のInventor Applicationに接続し、現在Activeなドキュメント内で、ルール名が"ルール0"のiLogicルールを実行するサンプルコードです。 Dim app As Inventor.Application Dim iLogicAddInGUID As String iLogicAddInGUID = "{3BDD8D79-2179-4B11-8A5A-257B1C0263AC}" Set app = GetObject(, "Inventor.Application") Dim addin As Inventor.ApplicationAddIn Set addin = app.ApplicationAddIns.ItemById(iLogicAddInGUID) If Not addin.Activated Then addin.Activate End If Dim iLogicAutomation As Object Set iLogicAutomation = addin.Automation Dim rule As Object For Each rule In iLogicAutomation.Rules(app.ActiveDocument) If rule.Name = "ルール0" Then Call iLogicAutomation.RunRule(app.ActiveDocument, "ルール0") End If Next
記事全体を表示
質問 Inventor API でインスタンスプロパティを取得・設定する方法はありますか? 回答 インスタンスプロパティは、Invntor2022で追加された機能です。 インスタンスプロパティへのアクセスについてもInventor 2022でAPIが追加されており、ComponentOccurrence.OccurrencePropertySets およびOccurrencePropertySetsEnabled によりアクセスが可能です。   以下のサンプルコードは、1番目のオカレンスに対してインスタンスプロパティを有効化し、インスタンスプロパティを追加します。 Dim app As Inventor.Application Set app = ThisApplication Dim doc As AssemblyDocument Set doc = a.ActiveDocument Dim compdef As AssemblyComponentDefinition Set compdef = doc.ComponentDefinition Dim occ As ComponentOccurrence Set occ = compdef.Occurrences.Item(1) 'インスタンスプロパティを有効化 occ.OccurrencePropertySetsEnabled = True 'プロパティセットを取得しプロパティを追加 Dim instancePropSet As PropertySet Set instancePropSet = occ.OccurrencePropertySets("{D5CDD505-2E9C-101B-9397-08002B2CF9AE}") Dim instanceProp As Property Set instanceProp = instancePropSet.Add("Hello", "Property World") MsgBox instanceProp.Name & ": " & instanceProp.Value   なお、インスタンスプロパティは、個々のコンポーネント(パーツ、アセンブリ)のインスタンスに情報(タグ、プロパティ)を割り当てる機能となり、パーツ、アセンブリの実体のないバーチャルコンポーネント等に対しては、利用することが出来ません。 このため、バーチャルコンポーネント等に対してocc.OccurrencePropertySetsEnabled = Trueを実行した場合、実行時エラーとなります。
記事全体を表示
質問 AutoLispでマルチ引出線のスタイルを設定する方法はありますか? 回答 マルチ引き出し線スタイルの設定については、以下の様なvla-put-***系の関数を用いることで設定ができます。 矢印の記号(S):vla-put-ArrowSymbol 矢印のサイズ(Z) :vla-put-ArrowSize 尺度(E):vla-put-ScaleFactor マルチ引出線の種類(M):vla-put-ContentType アタッチ(A):vla-put-BlockConnectionType 使用するブロック(S) :vla-put-block 以下のコードは、マルチ引き出し線スタイルの設定を変更するサンプルです。 (defun c:MLeaderStyleChange ( /MLeaderDict MLeaderStyleObj ) (vl-load-com) (vlax-for dict (vla-get-dictionaries (vla-get-activedocument (vlax-get-acad-object))) (if (and (vlax-property-available-p dict 'name) (= (vla-get-name dict) "ACAD_MLEADERSTYLE") ) (setq MLeaderDict dict))) ;名前が"Standard"であるMLeaderStyleを取得 (vlax-for itm MLeaderDict (if (= (vla-get-name itm) "Standard") (setq MLeaderStyleObj itm))) (if MLeaderStyleObj (progn ;矢印の記号(S) ;https://knowledge.autodesk.com/ja/support/autocad/learn-explore/caas/CloudHelp/cloudhelp/2021/JPN/AutoCAD-Core/files/GUID-6E09DCCA-313F-4FF4-BB1B-F41B512B9CC9-htm.html (setq Asn "_ORIGIN") ;一時的にDIMBLKを変更することで、指定した矢印の記号に対応するブロック定義を作成  (setq TmpVar (getvar "DIMBLK")) (setvar "DIMBLK" Asn) (vla-put-ArrowSymbol MLeaderStyleObj Asn) (setvar "DIMBLK" (if (eq TmpVar "") "." TmpVar)) ;矢印のサイズ(Z)  (vla-put-ArrowSize MLeaderStyleObj 10) ;尺度(E) (vla-put-ScaleFactor MLeaderStyleObj 5) ;マルチ引出線の種類(M) (vla-put-ContentType MLeaderStyleObj acBlockContent) ;アタッチ(A) acConnectBase(挿入位置) or acConnectExtents (範囲の中心) (vla-put-BlockConnectionType MLeaderStyleObj acConnectExtents) ; 使用するブロック(S) ; _DetailCallout → 詳細バルーン ; _TagBox    → 四角形 ; _TagCircle  → 円 ; _TagHexagon  → 六角形 ; _TagSlot   → スロット ; _Tagtriangle → 三角形 (setq blk "_Tagtriangle") (if (tblsearch "block" blk) (progn (vla-put-block MLeaderStyleObj blk) ) ) ) ) (princ) )
記事全体を表示
質問 AutoCAD Plant3D APIで3Dモデルの配管のライン番号タグの値を取得する方法はありますか? 回答 ライン番号タグ値は、「プロジェクトマネージャ->プロジェクト セットアップ->Plant 3D DWG設定配下のP&IDオブジェクトマッピング->配管グループ->P3d ライングループ ->プロパティマッピング配下のライン番号」で定義されています。     APIで値を取得する場合にも、この構造に沿った形でオブジェクトをたどって取得することが出来ます。 Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Dim ed As Editor = doc.Editor Dim Res As PromptEntityResult = ed.GetEntity("エンティティを選択 : ") If (Res.Status <> PromptStatus.OK) Then Exit Sub End If Dim currentProj As PlantProject = PlantApplication.CurrentProject Dim pipeProj As PipingProject = currentProj.ProjectParts("Piping") Dim dlm As DataLinksManager = pipeProj.DataLinksManager Dim dlm3d As DataLinksManager3d = pipeProj.DataLinksManager3d Dim rowId As Integer = dlm.FindAcPpRowId(Res.ObjectId) Try Dim lginfo As PipeLineGroupData = dlm3d.GetLineGroupInfo(rowId) Catch End Try Dim lgid As PnPRowIdArray = dlm.GetRelatedRowIds("P3dLineGroupPartRelationship", "Part", rowId, "LineGroup") If lgid Is Nothing Or lgid.Count = 0 Then Exit Sub End If Dim lgRowId As Integer = lgid.First.Value Dim vals As List(Of KeyValuePair(Of String, String)) = dlm.GetAllProperties(lgRowId, False) Try Dim lgRow As PnPRow = dlm.GetPnPDatabase().GetRow(lgRowId) Dim Tag As String = lgRow("Tag").ToString() ed.WriteMessage("タグの値:{0}", Tag) Catch ex As System.Exception End Try
記事全体を表示
質問 AutoCAD Plant3D .net APIで流向記号の向きと、流向記号に結びついている配管を取得する方法はありますか? 回答 流向記号の向きは、IsoArrowSymbolオブジェクトのDirectionプロパティにより取得が可能です。 また、記号に結びついている配管は、ConnectionManager.GetConnections() メソッドにより接続を取得し、取得した接続からオブジェクトIdを取得することで配管オブジェクトを取得することが可能です。 以下は、3Dモデル上で流向記号を選択し、選択した流向記号の方向をコンソールに出力し、接続から配管オブジェクトを取得するサンプルコードです。 Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim ed As Editor = doc.Editor Dim db As Database = doc.Database Dim peo As PromptEntityOptions = New PromptEntityOptions(vbLf & "Select flow:") Dim result As PromptEntityResult = ed.GetEntity(peo) If result.Status = PromptStatus.OK Then Using tr As Transaction = db.TransactionManager.StartTransaction() Try Dim ent As Entity = TryCast(tr.GetObject(result.ObjectId, OpenMode.ForRead), Entity) Dim wObj As Object = Nothing wObj = ent.GetType If (wObj.name = "IsoArrowSymbol") Then Dim isoArrowSymbol As Autodesk.ProcessPower.PnP3dObjects.IsoArrowSymbol = TryCast(ent, Autodesk.ProcessPower.PnP3dObjects.IsoArrowSymbol) ed.WriteMessage("\nArrow direction is ({0}, {1}, {2})", isoArrowSymbol.Direction.X, isoArrowSymbol.Direction.Y, isoArrowSymbol.Direction.Z) Dim connectionManager As ConnectionManager = New ConnectionManager() Dim connectionCollection As ConnectionCollection = connectionManager.GetConnections(isoArrowSymbol.ObjectId) For Each con As Connection In connectionCollection If con.ObjectId1 = isoArrowSymbol.ObjectId Or con.ObjectId2 = isoArrowSymbol.ObjectId Then Dim id As ObjectId = If(con.ObjectId1 = isoArrowSymbol.ObjectId, con.ObjectId2, con.ObjectId1) Dim part As Entity = TryCast(tr.GetObject(id, OpenMode.ForRead), Entity) If part.GetType.Name = "Pipe" Then Dim pipe As Pipe = TryCast(part, Pipe) ' Do something for pipe object... End If End If Next tr.Commit() End If Catch e As Autodesk.AutoCAD.Runtime.Exception ed.WriteMessage(e.Message) ed.WriteMessage(e.StackTrace) End Try End Using End If    
記事全体を表示
質問 AutoCAD Plant3D .net APIでスペックエディターのカタログデータ内部品種類総数を取得する方法はありますか? 回答 以下の手順でAPIを用いてカタログデータを読み込むことにより、Plant 3DのAPIを用いてカタログデータベースからデータを取得することでカタログのアイテム数(サイズ違いも別アイテムとしてカウント)を取得することが出来ます。 1.PipePartCatalogのOpenCatalog()メソッドでカタログを開く 2.PipePartCatalog オブジェクトのGetAvailablePartTypes()メソッドでパートの種類を取得 3.PipePartCatalog オブジェクトのSelectParts()メソッドを、2で取得した各パート名を指定して実行 4.SelectParts()で取得したPartQueryResults 内に含まれるPartの数をカウント 以下は、上述の手順でPartType毎に数を数え、最後に合計数を出力する.net(C#)で のサンプルコードです。 using Autodesk.ProcessPower.PartsRepository; using Autodesk.ProcessPower.PartsRepository.Catalog; using System; using System.Collections.Specialized; namespace ConsoleApp1 { class Program { static void Main(string[] args) { // open the catalog PipePartCatalog repository = PipePartCatalog.OpenCatalog(@"<path>"); StringCollection partTypes = repository.GetAvailablePartTypes(); int total = 0; foreach(string partType in partTypes) { PartQueryResults result = repository.SelectParts(partType, ""); Part part = null; int count = 0; while ((part = result.NextPart()) != null) { count++; } Console.WriteLine("PartType={0}, count = {1}", partType, count); total += count; } Console.WriteLine("-----------------"); Console.WriteLine("Total count {0}", total); Console.ReadKey(); } } } ※サンプルコード中の<path>を対象のカタログファイルへのパスに置き換えてください。 ※ビルドにはVisual StudioからAutoCAD Plant 3D SDKに含まれる以下のライブラリの参照設定が必要です。 PnIDMgd.dll PnP3dPartsRepository.dll PnPCommonMgd.dll PnPDataObjects.dll PnPSQLiteEngine.dll ※実行するexeファイルの存在するフォルダに、AutoCAD Plant 3D SDK内に含まれる、SQLite.Interop.DLLをコピーする必要があります。  
記事全体を表示
質問 AutoCAD Plant3D .net APIでアイソメメッセージの注記を取得する方法はありますか? 回答 アイソメメッセージの注記プロパティは、AutoCADの拡張ディクショナリ(ディクショナリ名"PnP3dMsg")に保存されています。 以下のサンプルコードは、3D図面で選択したIsoSphereSymbolの拡張ディクショナリ(ディクショナリ名"PnP3dMsg")を取得し、拡張データをResultBuffer配列として取得、メッセージとして出力します。 アイソメメッセージの注記プロパティは、ResultBufferから取得されるTypedValue 配列の先頭の要素です。 Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim ed As Editor = doc.Editor Dim db As Database = doc.Database Dim peo As PromptEntityOptions = New PromptEntityOptions(vbLf & "アイソメメッセージを選択してください:") Dim result As PromptEntityResult = ed.GetEntity(peo) If result.Status = PromptStatus.OK Then Using tr As Transaction = db.TransactionManager.StartTransaction() Try Dim ent As Entity = TryCast(tr.GetObject(result.ObjectId, OpenMode.ForRead), Entity) Dim wObj As Object = Nothing wObj = ent.GetType If (wObj.name = "IsoSphereSymbol") Then Dim isoSymbol As Autodesk.ProcessPower.PnP3dObjects.IsoSphereSymbol = TryCast(ent, Autodesk.ProcessPower.PnP3dObjects.IsoSphereSymbol) If (ent.ExtensionDictionary.IsValid = True) Then Dim extDict As DBDictionary = TryCast(tr.GetObject(ent.ExtensionDictionary, OpenMode.ForWrite), DBDictionary) If extDict.Contains("PnP3dMsg") Then Dim extDictEntId As ObjectId = extDict.GetAt("PnP3dMsg") Dim oData As Xrecord = tr.GetObject(extDictEntId, OpenMode.ForRead) Dim oRb As ResultBuffer = oData.Data For Each tv As TypedValue In oRb.AsArray ed.WriteMessage(vbCrLf + "拡張ディクショナリ TypeCode={0}, Value={1}:", tv.TypeCode.ToString, tv.Value) Next End If End If End If Catch e As Autodesk.AutoCAD.Runtime.Exception ed.WriteMessage(e.Message) ed.WriteMessage(e.StackTrace) End Try End Using End If
記事全体を表示
質問 AutoCAD ObjectARX .net APIで3D上の中心点、半径、開始点、終了点、法線を指定して円弧を作成する方法はありますか? 回答 APIで3D上の中心点、半径、開始点、終了点、法線を指定して円弧を作成するメソッドは提供されていませんが、3D上の中心点、半径、開始点、終了点、法線が分っている場合、CircularArc3dを用いることで、開始点、終了点から開始角、終了角を求めることができます。 開始角、終了角を取得した後、以下の中心点、法線、半径、開始角、終了角を指定する、円弧のコンストラクタを用いることで円弧を作成することができます。 public Arc(Point3d center, Vector3d normal, double radius, double startAngle, double endAngle); 以下は中心点、半径、開始点、終了点、法線から、開始角、終了角を取得し、円弧を作成するコードです。 Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; Vector3d vNormal = new Vector3d(1, 1, 1); //法線 Point3d pStart = new Point3d(157.7345, 71.1328, 71.1328);//開始点 Point3d pEnd = new Point3d(71.1328, 157.7345, 71.1328);//終了点 Point3d pCenter = new Point3d(100, 100, 100);//中心点 double rad = 70.71;//半径 //中心点、法線、半径を指定して円を作成 CircularArc3d cCirc = new CircularArc3d(pCenter, vNormal, rad); double parStart = cCirc.GetParameterOf(pStart); double parEnd = cCirc.GetParameterOf(pEnd); double parMid = (parStart + parEnd) * 0.5; //作成した円を用いて、円弧中点、開始、終了点を取得 Point3d pMid = cCirc.EvaluatePoint(parMid); pStart = cCirc.EvaluatePoint(parStart); pEnd = cCirc.EvaluatePoint(parEnd); cCirc.Dispose(); //取得した開始点、終了点、円弧中点を用いて円弧を作成 CircularArc3d cArc = new CircularArc3d(pStart, pMid, pEnd); //作成した円弧のアングルを取得 double angle = cArc.ReferenceVector.AngleOnPlane(new Plane(cArc.Center, cArc.Normal)); //円弧を作成 Arc arc = new Arc(cArc.Center, cArc.Normal, cArc.Radius, cArc.StartAngle + angle, cArc.EndAngle + angle); cArc.Dispose(); //作成したArcをデータベースに追加 using (Transaction tr = doc.TransactionManager.StartTransaction()) { BlockTableRecord btr = tr.GetObject(doc.Database.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord; btr.AppendEntity(arc); tr.AddNewlyCreatedDBObject(arc, true); tr.Commit(); }
記事全体を表示
質問 AutoCAD MechanicalのAPIでパーツリストの値を取得する方法はありますか? 回答 AutoCAD Mechanicalのパーツリストは、McadPartListのitemListプロパティによりMcadBOMItemsにアクセスすることで値を取得できます。 以下はパーツリストの値を取得するVBAのサンプルコードとなります。 Sub PartListData() Dim util As AcadUtility Set util = ThisDrawing.Utility Dim obj As Object Dim pt As Variant On Error Resume Next util.Prompt vbCrLf util.GetEntity obj, pt, "パーツリストの選択: " If Not TypeOf obj Is McadPartList Then util.Prompt "パーツリストを選択してください." + vbCrLf Exit Sub End If util.Prompt "選択されたパーツリストのデータ: " + vbCrLf Dim partsList As McadPartList Set partsList = obj Dim standard As McadBOMStandard Set standard = partsList.SymbolStandard Dim columnDefinitions As McadColumnDefinitions Set columnDefinitions = standard.columns Dim bomItems As McadBOMItems Set bomItems = partsList.itemList Dim bomItem As McadBOMItem For Each bomItem In bomItems Dim data As Variant data = bomItem.data Dim i As Integer util.Prompt vbTab + vbTab + "------------" + vbCrLf Dim column As McadColumnDefinition For Each column In columnDefinitions If column.IsVisible Then If column.Name = "ITEM" Then util.Prompt vbTab + vbTab + "ITEM" + vbTab _ + vbTab + vbTab + bomItem.ItemNumber + vbCrLf ElseIf column.Name = "QTY" Then util.Prompt vbTab + vbTab + "QTY" + vbTab _ + vbTab + vbTab + CStr(bomItem.Quantity) + vbCrLf Else For i = LBound(data) To UBound(data) If column.Name = data(i, LBound(data, 2)) Then util.Prompt vbTab + vbTab + data(i, LBound(data, 2)) + vbTab _ + vbTab + vbTab + data(i, UBound(data, 2)) + vbCrLf End If Next End If End If Next Next End Sub
記事全体を表示
質問 AutoCAD Mechanical APIでパーツ参照の値を取得する方法はありますか? 回答 パーツ参照はMcadPartReferenceオブジェクトのdataプロパティから取得される2次元配列により値を取得できます。 以下はパーツ参照の値を取得するVBAサンプルコードです。 Sub PartReferenceSymbolData() Dim util As AcadUtility Set util = ThisDrawing.Utility Dim obj As Object Dim pt As Variant On Error Resume Next util.Prompt vbCrLf util.GetEntity obj, pt, "パーツ参照の選択: " If Not TypeOf obj Is McadPartReference Then util.Prompt "パーツ参照を選択してください." + vbCrLf Exit Sub End If util.Prompt "選択されたパーツ参照のデータ: " + vbCrLf Dim partRef As McadPartReference Set partRef = obj Dim data As Variant data = partRef.data Dim i As Integer For i = LBound(data) To UBound(data) util.Prompt vbTab + vbTab + data(i, LBound(data, 2)) + vbTab _ + vbTab + vbTab + data(i, UBound(data, 2)) + vbCrLf Next End Sub
記事全体を表示
質問 AutoCAD APIで図面をブロックとして挿入すると、属性の編集ができない。 回答 AutoCADのデータベースでは、ブロックの定義情報はBlockTableRecordオブジェクトとして、図面に配置されたブロックはBlockReferenceオブジェクトとして保持されます。 ブロックの属性情報も同様に、属性の定義情報がAttributeDefinitionとして、また配置されたブロックの属性情報はAttributeReferenceとして保持される構造となっています。 APIで図面をブロックとして挿入した際に、配置したブロックの属性情報であるAttributeReferenceを作成する処理が記述する必要があります。  ※コード中の変数dwgnameには、挿入するDWGファイルのパスを指定 Dim doc As Document = Application.DocumentManager.MdiActiveDocument Dim db As Database = doc.Database Dim ed As Editor = doc.Editor Dim dwgname As String = "<挿入するDWGファイルのパスを指定>" Dim blockname As String = System.IO.Path.GetFileNameWithoutExtension(dwgname) Dim ppo As PromptPointOptions = New PromptPointOptions("\n挿入位置を指定してください: ") Dim ppr As PromptPointResult = ed.GetPoint(ppo) If ppr.Status Exit Sub End If Using xDb As Database = New Database(False, True) xDb.ReadDwgFile(dwgname, System.IO.FileShare.ReadWrite, True, "") Using tr As Transaction = doc.TransactionManager.StartTransaction() Dim id As ObjectId = db.Insert(blockname, xDb, True) If id.IsNull Then ed.WriteMessage("\nブロックの挿入に失敗しました") Exit Sub End If Dim currSpace As BlockTableRecord = tr.GetObject(db.CurrentSpaceId, OpenMode.ForWrite) Dim insert As BlockReference = New BlockReference(ppr.Value, id) currSpace.AppendEntity(insert) insert.SetDatabaseDefaults() tr.AddNewlyCreatedDBObject(insert, True) Using btAttRec As BlockTableRecord = insert.BlockTableRecord.GetObject(OpenMode.ForRead) Dim atColl As AttributeCollection = insert.AttributeCollection For Each subid As ObjectId In btAttRec Dim ent As Entity = subid.GetObject(OpenMode.ForRead) Dim attDef As AttributeDefinition = Nothing If TypeOf ent Is AttributeDefinition Then attDef = ent End If If Not IsNothing(attDef) Then ed.WriteMessage("\n値: " + attDef.TextString) Dim attRef As AttributeReference = New AttributeReference() attRef.SetPropertiesFrom(attDef) attRef.Visible = attDef.Visible attRef.SetAttributeFromBlock(attDef, insert.BlockTransform) attRef.HorizontalMode = attDef.HorizontalMode attRef.VerticalMode = attDef.VerticalMode attRef.Rotation = attDef.Rotation attRef.TextStyleId = attDef.TextStyleId attRef.Position = attDef.Position + ppr.Value.GetAsVector() attRef.Tag = attDef.Tag attRef.FieldLength = attDef.FieldLength attRef.TextString = attDef.TextString attRef.AdjustAlignment(db) atColl.AppendAttribute(attRef) tr.AddNewlyCreatedDBObject(attRef, True) End If Next End Using tr.Commit() End Using End Using
記事全体を表示
質問 AutoCAD .net APIで球の中心座標を取得する方法はありますか? 回答 球の中心の座標を取得する場合、球のSolid3dエンティティから境界表示ライブラリ(Boundary Representation API)を利用してBrepEntityを取得し、Faceを経由してSurfaceにアクセスすることでShpreを取得し、中心座標を取得することができます。 Entity entity = trans.GetObject(oId, OpenMode.ForWrite, false, true) as Entity; Solid3d solid = entity as Solid3d; if( null != solid) { FullSubentityPath entityPath = new FullSubentityPath(new ObjectId[] { solid.ObjectId }, new SubentityId(SubentityType.Null, IntPtr.Zero)); Brep brep = new Brep(entityPath); using (brep) { foreach (Complex complex in brep.Complexes) { foreach (Shell shell in complex.Shells) { foreach (Autodesk.AutoCAD.BoundaryRepresentation.Face face in shell.Faces) { ExternalBoundedSurface exbsf = face.Surface as ExternalBoundedSurface; if (null != exbsf) { Sphere aSphere = exbsf.BaseSurface as Sphere; if (null != aSphere) { Point3d center = aSphere.Center; } } } } } } }
記事全体を表示
質問 AutoCAD .net APIでデータリンク元ファイルの変更の有無を知る方法はありますか? 回答 データリンクのリンク先のファイルの更新有無は、ファイルの更新日時タイムスタンプを元に判定が行われています。 AutoCAD .net APIのDataLinkオブジェクトのGetUpdateStatus()メソッドにより、DataLink内で保持している日時(UTC:協定世界時)を取得可能です。 また、リンク先のファイルのパスについては、DataLinkオブジェクトのConnectionStringプロパティより取得可能です(パス文字列のsuffixを除く必要あり) 以下は、ドキュメント内のDataLinkを取得し、内部で保持している日時とパス情報を取得しコマンドラインに出力する、C#のサンプルプログラムです。   Document doc = Application.DocumentManager.MdiActiveDocument; Editor ed = doc.Editor; Database db = doc.Database; using (Transaction tx = doc.TransactionManager.StartTransaction()) { DataLink link = null; var dic = (DBDictionary)tx.GetObject(db.DataLinkDictionaryId, OpenMode.ForRead); foreach (DBDictionaryEntry entry in dic) { link = tx.GetObject(entry.Value, OpenMode.ForRead) as DataLink; if (link != null) { string source = link.ConnectionString; string[] tokens = source.Split('!'); ed.WriteMessage("Data Link:{0} Link Source: {1}", link.Name, tokens[0]); UpdateDirection pDir; DateTime pTime; string errMessage = ""; link.GetUpdateStatus(out pDir, out pTime, errMessage); ed.WriteMessage("Data Link:{0}, Direction{1} DateTime: {2}", link.Name, pDir, pTime); } } tx.Commit(); }   .netのAPIを用いてソース側のファイルの更新日時を取得し比較することで更新の有無を知ることが出来ます。
記事全体を表示
質問 AutoCAD  .net APIでDBTextの幅を取得する方法はありますか? 回答 AutoCAD .Net APIでは、AutoCADでGUI表示を持つ各エンティティは基底クラスとしてEntityクラスがあります。 Entityクラスの GeometricExtentsプロパティにより、エンティティを囲む矩形領域の座標(最小と最大座標、すなわち矩形の左下と右上)を持つ構造体を取得することができます。 以下のサンプルコードでは、DBTextに回転角が指定されいる場合を考慮し、一時的にテキストをWCSにTransformしてからGeometricExtentsを取得、幅の計算をしています。 Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; PromptEntityOptions entOpts = new PromptEntityOptions("\nテキストを選択: "); entOpts.SetRejectMessage("\nテキストを選択してください"); entOpts.AddAllowedClass(typeof(DBText), true); var entRes = ed.GetEntity(entOpts); if (entRes.Status != PromptStatus.OK) return; using (Transaction tr = db.TransactionManager.StartTransaction()) { DBText text = tr.GetObject(entRes.ObjectId, OpenMode.ForWrite) As DBText; Plane plane = new Plane(Point3d.Origin, text.Normal); var xform = Matrix3d.Rotation(text.Rotation, text.Normal, text.Position) * Matrix3d.Displacement(text.Position.GetAsVector()) * Matrix3d.PlaneToWorld(plane); text.TransformBy(xform.Inverse()); var extents = text.GeometricExtents; double minX = extents.MinPoint.X, minY = extents.MinPoint.Y, maxX = extents.MaxPoint.X, maxY = extents.MaxPoint.Y; double dist = new Point2d(minX, minY).GetDistanceTo(new Point2d(maxX, minY)); ed.WriteMessage(String.Format("テキストの幅は {0} です。", dist)); text.TransformBy(xform); tr.Abort(); }
記事全体を表示
質問 AutoCAD Mechanical のパーツリストを、APIからエクセルに出力する方法はありますか? 回答 AutoCAD Mechanical固有のAPIである、IMcadPartListオブジェクトのExportPartListメソッドを利用することで行うことができます。 以下のコードは、C:\TEMPフォルダ(BasePath変数の値)配下に、現在アクティブなドキュメントの名前がMAINのパーツ一覧をエクセル形式で出力します。 なお、コードの実行には、VBAエディタにて[ツール]-[参照設定]からAutoDesk SymBBAuto 2021 Type Libraryの参照設定を行う必要があります。 Public Sub exportPartsListExcel() Dim BasePath As String Dim BomName As String BasePath = "C:\TEMP" BomName = "MAIN" Dim acadDoc As AcadDocument Set acadDoc = Application.ActiveDocument ' SymbolBBMMgrを取得 Dim symBBmgr As McadSymbolBBMgr Set symBBmgr = acadDoc.Application.GetInterfaceObject("SymBBAuto.McadSymbolBBMgr") ' McadBOMMgrを取得 Dim cadBOMmgr As SymBBAuto.McadBOMMgr Set cadBOMmgr = symBBmgr.BOMMgr ' BOMNameのBOMTableが存在するかをチェック If cadBOMmgr.BOMTableExists(BomName) Then 'BOMTableを取得 Dim cadBom As SymBBAuto.McadBOM Set cadBom = cadBOMmgr.GetBOMTableByName(BomName) 'パーツリストを取得 Dim partsList As SymBBAuto.IMcadPartList Set partsList = cadBom.partLists.Item(0) 'エクセル形式でエクスポート If Not partsList Is Nothing Then Dim fileName As String Dim token As Variant token = Split(acadDoc.Name, ".") Call cadBOMmgr.ExportPartList(SymBBAuto.McadBOMExportFormatType.exEXCEL97, partsList, BasePath & "\" & token(0) & ".xls", "MAIN", True) End If End If End Sub
記事全体を表示
質問 APIで、シートメタルの展開図の折り曲げ位置のエッジ線から、山折り/谷折の情報を参照する方法はありますか? 回答 図面(.idw)の折り曲げ位置の線から、親となるオブジェクトを経由して元のパーツファイル(.iptファイル)のオブジェクトにアクセスし、FlatBendResult オブジェクトにアクセスすることで、折り曲げ方向の山折り/谷折りの情報を取得することができます。 次のコードは、図面(.idw)の展開図にて、選択状態にある折り曲げ位置の線から、折り曲げに関する情報を取得しメッセージボックスに表示を行います。 DrawingDocument oDoc = (DrawingDocument)m_inventorApplication.ActiveDocument; SelectSet oSelectSet = m_inventorApplication.ActiveDocument.SelectSet; DrawingCurveSegment oDrawingCurveSegment = null; if( oSelectSet.Count == 1 && oSelectSet[1] is DrawingCurveSegment) { oDrawingCurveSegment = (DrawingCurveSegment)oSelectSet[1]; } else { MessageBox.Show("DrawingCurveSegmentを一つ選択してください."); return; } DrawingCurve oDrawingCurve = oDrawingCurveSegment.Parent; Edge oEdge = (Edge)oDrawingCurve.ModelGeometry; SheetMetalComponentDefinition oSMDef = (SheetMetalComponentDefinition)oEdge.Parent.ComponentDefinition; FlatPattern oFlatPattern = oSMDef.FlatPattern; FlatBendResult oBendResult = (FlatBendResult)oFlatPattern.FlatBendResults[oEdge]; UnitsOfMeasure oUOM = oDoc.UnitsOfMeasure; string message = "---------------- Flat Bend Infos----------------\n" + "Internal Name:{InternalName} \n" + "Bend On {Side} Face \n" + "Bend Angle = {Angle} \n" + "Bend Radius = {Radius} \n" + "Bend Direction: Bend {BendDirection} \n" + "---------------- Flat Bend Infos----------------"; MessageBox.Show(message .Replace("{InternalName}", oBendResult.InternalName) .Replace("{Side}", oBendResult.IsOnBottomFace ? "Bottom" : "Top") .Replace("{Angle}", oUOM.GetStringFromValue(oBendResult.Angle, UnitsTypeEnum.kDefaultDisplayAngleUnits)) .Replace("{Radius}", oUOM.GetStringFromValue(oBendResult.InnerRadius, UnitsTypeEnum.kDefaultDisplayLengthUnits)) .Replace("{BendDirection}", oBendResult.IsDirectionUp ? "Up" : "Down") );
記事全体を表示