注目の投稿

技術者として人として

 技術者として人として これまで、生きてきて、ひとりで解決していくものと考えていた。 知り合いなどの助言もあるが、それだけでも、やり切れない場合があった。 長い間、この性格を作り上げてきて正確などは、変わることがないだろうと決めつけていた。 思考は、そうそう簡単には変わらないもの。 ひとりでは、変わらないものであるということに気づくことができた。 日本では、カウンセリングという文化が浸透していないが、古くは仏教など、生活の為に、必要な事を、学ぶ機会が少ないと思う。 カウンセリングは、それを、実現できるものと思う。 ひとりでは解決できないこと、それは、正しい方法を見つけられないから。それを、学んでいないからで、専門的な第三者が心理学などを通して教えてくれることは救いとなる。 生きにくい世の中であることは間違いない。 生きやすくする方法もあると知ることができた。 技術者は孤独になるときがあり、ひとりでなんともならない時の対策方法を見失う時がある。日本ではカウンセリング文化が浸透していないような気がするが、ひとりでは解決出来ない時。救われる方法があると知る事になる。 https://t.co/LBKNwUyXg5 — chsugiyama (@chx_sugi_001) January 3, 2023

Autocad to Excel 円の座標データをセルに表示 Excel VBA

エクセルからAUTOCADで選択中の円の座標を取得

選択している円のデータ情報を知りたいという質問がありましたので、下記のように変更しました。

SelectionSets.Add 選択セットを使用しています。VBAの最後に削除しています。


AUTOCADのコードでは、ThisDrawingですが、Excelから設定するには、AcadDocと書き直します。
ThisDrawing.SelectionSets.Add("Sample")
AcadDoc.SelectionSets.Add("Sample") 

AcadDocは下記のように定義
Set AcadDoc = AcadApp.ActiveDocument()

参照設定
AutoCAD 2021 Type Library にチェックしています。


  • AUTOCADで、選択した円のデータを抽出
1.マクロ起動後、
2.AUTOCAD画面で円を選択。
3.円を青色に変更して、Excelに座標を書き出す。

  • VBA CODE

Option Explicit

Private AcadDoc As AutoCAD.AcadDocument     'モジュール定義
Private AcadApp As AutoCAD.AcadApplication  ' AutoCAD アプリケーション変数


Public Sub AutocadSelectionSET()

    Set AcadApp = GetObject(, "AutoCAD.Application")    ' xls追加
    Set AcadDoc = AcadApp.ActiveDocument()
         
    Dim objSelSet As AcadSelectionSet
    Dim objEntity As AcadEntity

    Dim objCircle As AcadCircle
    Dim Str As String
    Dim N

    Set objSelSet = AcadDoc.SelectionSets.Add("Sample")  'いったん選択セットを設定する。
    
    Call objSelSet.SelectOnScreen ' autocad 画面上で、円を選択する。マクロ起動後にAUTOCAD画面で選択する。


    N = ActiveCell.Row
         
         Cells(N, ActiveCell.Column + 0) = "objCircle.center(0)"
         Cells(N, ActiveCell.Column + 1) = "objCircle.center(1)"
         Cells(N, ActiveCell.Column + 2) = "objCircle.center(2)"



    N = ActiveCell.Row + 1

    For Each objEntity In objSelSet
      
      If objEntity.ObjectName = "AcDbCircle" Then
         Set objCircle = objEntity
           
         'Str = "OBJ name" & objEntity.ObjectName & "半径" & objCircle.Area & vbCrLf & "中心座標" & objCircle.center(0) & "," & objCircle.center(1) & "," & objCircle.center(2)
            ' MsgBox Str
           
            ' MsgBox "ECXEL 現在のセルの左に入力します。"
            
         Cells(N, ActiveCell.Column + 0) = objCircle.center(0)
         Cells(N, ActiveCell.Column + 1) = objCircle.center(1)
         Cells(N, ActiveCell.Column + 2) = objCircle.center(2)
         
      
         objEntity.Color = acBlue  ' 選択した円を青くする。不要の場合は削除する。
      
         N = N + 1
      End If
    Next
    

    AcadDoc.SelectionSets("Sample").Delete      '使用後 選択セット削除する。

End Sub







モデル空間にある円の座標全てをエクセルに書き出す。
従来のコードでは、モデル空間の全ての円の情報を拾い出すようになっていました。
下記のコードでは、全ての円のデータを拾い出しています。
  • 説明

Autocadで、円を選択しておく。
エクセルから下記マクロを実行すると選択中のセルから左へ座標を入力する。

  • VBA code

Option Explicit

Private AcadDoc As AutoCAD.AcadDocument     'モジュール定義
Private AcadApp As AutoCAD.AcadApplication  ' AutoCAD アプリケーション変数

' --- 現在選択中の図形(円)の情報を取得する
' --- AcadEntity
' --- Autocad 2006 Excel2003
Sub AutocadGetEntity()

    Set AcadApp = GetObject(, "AutoCAD.Application")    ' xls追加
    Set AcadDoc = AcadApp.ActiveDocument()              ' xls追加
     
    Dim objEntity As AcadEntity
    Dim objCircle As AcadCircle
    Dim Str As String
     
    ' モデル空間に含まれるすべての図形を列挙し、
    ' 一つずつAcadEntity型のオブジェクト変数objEntityに取り出す。
    'For Each objEntity In ThisDrawing.ModelSpace       ' Autocad Code
    For Each objEntity In AcadDoc.ModelSpace
         
        ' 取り出された図形のAutoCADクラス名がAcDbCircle(円)の場合は、
        ' AcadCircle型のオブジェクト変数objCircleにキャストして半径を表示。
        If objEntity.ObjectName = "AcDbCircle" Then
            Set objCircle = objEntity
            Str = "半径" & objCircle.Area & vbCrLf & "中心座標" & objCircle.center(0) & "," & objCircle.center(1) & "," & objCircle.center(2)
            MsgBox Str
           
            MsgBox "ECXEL 現在のセルの左に入力します。"
            Cells(ActiveCell.Row, ActiveCell.Column + 0) = objCircle.center(0)
            Cells(ActiveCell.Row, ActiveCell.Column + 1) = objCircle.center(1)
            Cells(ActiveCell.Row, ActiveCell.Column + 2) = objCircle.center(2)
       
        End If
    Next

End Sub

コメント

  1. 非常にありがたいコードの紹介で勉強させてもらっています。
    上記のコードで実行すると、モデルスペースにある円を全部拾ってしまうのですが、現在選択している円だけの情報を取得するにはどうすればよいでしょうか?
    わかりましたら教えていただきたいです。宜しくお願いします。

    返信削除

コメントを投稿

このブログの人気の投稿

DesignSpark Mechanical オブジェクトの拡大、縮小 "Scale the body"

EXCEL VBA EXCELの表からAUTOCADの文字を書き換える. EXCEL VBA Rewrite the characters of AUTOCAD from the table of EXCEL.

エクセルからパワーポイントのノートを書き込むVBA