Bricscad .NET VB サンプル
■アクティブな図面と同じフォルダのDWGファイルを読む (2015/ 5/ 8)
※CAD上には、読み込まれない
<CommandMethod("DirDwgnames", CommandFlags.Modal)> _
Public Shared Sub CmdDwgNamesEx()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim doc As Document
'' 現在アクティブなドキュメントを取得
doc = Application.DocumentManager.MdiActiveDocument
'' ファイル名からフォルダ名を取得
Dim dwgdir As String = System.IO.Path.GetDirectoryName(doc.Name)
ed.WriteMessage(vbCrLf + dwgdir)
If dwgdir <> "" Then
Dim dwgnames() As String
'' 同じフォルダ内のDWGファイル名を取得
dwgnames = Directory.GetFiles(dwgdir, "*.dwg", System.IO.SearchOption.AllDirectories)
Dim dwgname As String
'' ファイルを順に開く
For Each dwgname In dwgnames
Using db As Database = New Database(False, True)
Try
'' ファイルを開く
db.ReadDwgFile(dwgname, FileShare.Read, True, Nothing)
ed.WriteMessage(vbCrLf + db.Filename)
Catch ex As Exception
'' 編集中の場合は、eCantOpenFile エラーになる
ed.WriteMessage(vbCrLf + "エラー: " + dwgname + ":" + ex.Message)
End Try
End Using
Next
End If
End Sub
<CommandMethod("dwgnames", CommandFlags.Modal)> _
Public Shared Sub CmdDwgNames()
Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
Dim doc As Document
Dim lmax As Point2d
Dim lmin As Point2d
For Each doc In Application.DocumentManager
'' ファイル名(フルパス)保存されていないときは、ファイル名のみ
ed.WriteMessage(vbCrLf + doc.Name)
'' データベースを取得
Using db As Database = doc.Database
lmax = db.Limmax
lmin = db.Limmin
ed.WriteMessage(vbCrLf + "LIMMAX=" + lmax(0).ToString() + "," + lmax(1).ToString())
ed.WriteMessage(vbCrLf + "LIMMIN=" + lmin(0).ToString() + "," + lmin(1).ToString())
ed.WriteMessage(vbCrLf + "DIMSCALE=" + db.Dimscale.ToString())
'' 保存されていないときは ""、その他はフルパス
ed.WriteMessage(vbCrLf + "FILENAME=" + db.Filename)
End Using
Next
End Sub
■アクティブな図面の属性を取得する LISP 関数 (2015/ 5/ 8)
'' LISP関数:属性の値をn個取得して、リストで返す
'' 引数 :"ブロック名" "属性名1" "属性名2" ...
'' 戻り値 :("属性文字1" "属性文字2" ....)
'' :ブロック名が存在しないときは、nil
'' 例:(GetAttString "TITLE" "ZSHEET" "ZITEM9" "ZITEM8") 戻り値:("123" "21" "23")
''
<LispFunction("GetAttString")> _
Public Shared Function FuncGetAttString(ByVal rbArgs As ResultBuffer) As ResultBuffer
'' LISPに返す戻り値の初期値 = nil
Dim rbResult As ResultBuffer = New ResultBuffer(New TypedValue(LispDataType.Nil))
Dim BlkName As String = ""
Dim TagName() As String
Dim TagString() As String
Dim cnt As Integer
Dim i As Integer
'' LISP関数の引数の数とタイプをチェック
Dim tvArr As TypedValue() = rbArgs.AsArray()
cnt = 0
If tvArr.Count >= 2 Then
cnt = tvArr.Count - 1
ReDim TagName(tvArr.Count - 2)
ReDim TagString(tvArr.Count - 2)
For i = 0 To tvArr.Count - 1
'' 最初の文字が、ブロック名
If i = 0 Then
If tvArr(0).TypeCode = LispDataType.Text Then BlkName = tvArr(0).Value Else BlkName = ""
'' それ以降は、属性のタグ名
Else
If tvArr(i).TypeCode = LispDataType.Text Then TagName(i - 1) = tvArr(i).Value Else TagName(i - 1) = ""
End If
'' 初期化
TagString(i - 1) = ""
Next
'' 文字列2個以上(属性1個以上)
If BlkName <> "" And cnt > 0 Then
'' 編集中の図面のデータベースを取得
Using db As Database = Application.DocumentManager.MdiActiveDocument.Database
'' トラザクションの開始
Using trans As Transaction = db.TransactionManager.StartTransaction()
Try
Dim bt As BlockTable = trans.GetObject(db.BlockTableId, OpenMode.ForRead)
'' モデルの図形テーブルレコード
Dim btr As BlockTableRecord = trans.GetObject(bt(BlockTableRecord.ModelSpace), OpenMode.ForRead)
Dim objId As ObjectId
Dim entityObj As Entity
Dim blkRefObj As BlockReference
Dim attCollction As AttributeCollection
Dim Flag As Boolean = False
Dim n As Integer = 0
For Each objId In btr
'' オブジェクトIDからエンティティを取得
entityObj = trans.GetObject(objId, OpenMode.ForRead, False, True)
'' ブロックであれば・・・
If TypeOf entityObj Is BlockReference Then
blkRefObj = CType(entityObj, BlockReference)
'' 属性コレクションを取得
attCollction = blkRefObj.AttributeCollection
'' 属性が有れば・・・
If attCollction.Count > 0 Then
Dim attObjId As ObjectId
Dim attObjEntity As Entity
Dim attRef As AttributeReference
'' ブロック名の確認
If blkRefObj.Name = BlkName Then
For Each attObjId In attCollction
attObjEntity = trans.GetObject(attObjId, OpenMode.ForRead, False, True)
'' 属性を確認
If TypeOf attObjEntity Is AttributeReference Then
attRef = CType(attObjEntity, AttributeReference)
For i = 0 To cnt - 1
'' 属性名を確認
If attRef.Tag = TagName(i) Then
TagString(i) = attRef.TextString
n = n + 1
If n = cnt Then
'' 検索終了
Flag = True
Exit For
End If
End If
Next
End If
Next
End If
End If
End If
If Flag Then Exit For
Next
Catch ex As Exception
Application.ShowAlertDialog("エラー GetAttStringEx : " + ex.Message)
End Try
End Using
End Using
'' レザルトバッファを破棄
rbResult.Dispose()
'' レザルトバッファのLISTを作成 ex:("TEXT1" "TEXT2" TEXT3")
rbResult = New ResultBuffer(New TypedValue(LispDataType.ListBegin))
For i = 0 To cnt - 1
rbResult.Add(New TypedValue(LispDataType.Text, TagString(i)))
Next
rbResult.Add(New TypedValue(LispDataType.ListEnd))
End If
End If
Return rbResult
End Function