TeighaShell で図面の作成や変更ができることを確認できましたでしょうか?
共通する処理はシェルスクリプトのライブラリファイルを作って、それを再利用することも可能です。TeighaShellプロジェクト
TeighaShell.ps1 ライブラリスクリプト
注意
TeighaShell プロジェクトの OdActivationInfo.cs ファイルは仮のファイルになっています。OpenDesignAllianceのメンバーになって、OdActivattionInfo.cs の正式のファイルを入手してTeighaShellをビルドしないと、TeighaShell は動作しません。書き込みサンプル
# TsLib.ps1 の関数や変数を取り込みスクリプトについて解説すると#から始まる行はコメント行である。
. C:\Repos\CADKhanRepos\TeighaShell\TeighaShell.ps1
# 既存の図面を開く
$db = Open-Drawing c:\temp\test.dwg
# トランザクションを作成(すると以降の図形は1つのトランザクションにまとめられる)
$tr = $db.TransactionManager.StartTransaction()
# 保存先としてのモデルブロックのオブジェクトIDを取得
$model = Get-ModelBlockId $db
# 線分の始点と終点を作成
$p0 = Create-Point3d 0,0,0
$p1 = Create-Point3d 10,10,0
# 連続して5つの線分を作成
Add-Line $model $p0 $p1
Add-Line $model $p0 $p1
Add-Line $model $p0 $p1
Add-Line $model $p0 $p1
Add-Line $model $p0 $p1
# トランザクションの確定と破棄
$tr.Commit()
$tr.Dispose()
# 図面の上書き保存と破棄
Save-Drawing -Database $db
$db.dispose()
「.(ドット) ファイル名」は、ファイル名で指定したスクリプトをライブラリとして読み込むという意味である。スクリプトの中で使用すると、そのスクリプトの実行中のみ有効なライブラリスクリプトになり、TeighaShellのプロンプトで使用するとTeighaShellのセッションで有効なライブラリスクリプトになる。
Open-DrawingとSave-DrawingはTeighaShell.exeに実装されたコマンドレット。
Get-ModelBlockId, Create-Point3d, Add-Line はライブラリスクリプトに実装された関数。
他はそれぞれのインスタンスのメソッドやプロパティとなっている。
ライブラリスクリプト
Create-Point3d 関数は、x,y,z 座標値から Point3d インスタンスを作る簡単な関数。
function Create-Point3dAdd-Line 関数は、指定したブロックテーブルレコードに、始点と終点を指定して線分を作成する関数。画層、線色、線種、太さといったプロパティは、CLAYER、CECOLOR、CELTYPE、CELWEIGHT システム変数から設定する。
{
param($pts)
return New-Object -TypeName Teigha.Geometry.Point3d -ArgumentList $pts
}
function Add-Lineトランザクションが実行中の場合、線分は実行中のトランザクションに登録する。実行中のトランザクションがない場合、関数内でトランザクションを作成し 線分を図面に登録する。
{
param([Teigha.DatabaseServices.ObjectId]$owner, [Teigha.Geometry.Point3d]$start,[Teigha.Geometry.Point3d]$end)
$db = $owner.Database
$tr = $db.TransactionManager.topTransaction
$ttr = $false
if( !$tr )
{
$tr = $db.TransactionManager.startTransaction()
$ttr = $true
}
$rec = $tr.GetObject($owner,$openmode::ForWrite)
$ent = New-Object -TypeName Teigha.DatabaseServices.Line
$ent.SetDatabaseDefaults($db)
$ent.StartPoint = $start
$ent.EndPoint = $end
$id = $rec.AppendEntity($ent)
$tr.AddNewlyCreatedDBObject($ent,$true)
if( $ttr )
{
$tr.Commit()
$tr.Dispose()
}
return $id
}
読み込みサンプル
# TeighaShell.ps1 の関数や変数を取り込み読み込みサンプルのキモは、ブロックテーブルレコードに登録されている図形のオブジェクトIDがforeach 構文で順に取得できることだ。
. C:\Repos\CADKhanRepos\TeighaShell\TeigaShell.ps1
# 既存の図面を開く
$db = Open-Drawing c:\temp\test.dwg
# トランザクションを作成(すると以降の図形は1つのトランザクションにまとめられる)
$tr = $db.transactionmanager.starttransaction()
# 読み込み元としてのモデルブロックのオブジェクトIDを取得
$model = Get-ModelBlockId $db
# モデルブロックレコードオブジェクトを取得
$rec = $tr.GetObject($model,$openmode::forread)
# オブジェクトIDが順に取得できる
foreach($id in $rec)
{
$ent = $tr.GetObject($id, $openmode::forRead)
Write-Output $ent,$ent.Handle
}
# トランザクションの確定と破棄
$tr.Commit()
$tr.Dispose()
# WorkingDatabase を上書き保存と破棄
$db.dispose()
オブジェクトIDを図形にするには、トランザクションのGetObject()メソッドが必要。変数$entの型は実行中に変わるので、図形種類によって処理を分岐し、存在しないメソッドやプロパティをアクセスしないようにしてください。
画層テーブルから画層レコードを取得するのも、foreach構文で順に取得することも可能ですし、$ltbl[画層名]のように配列操作でも画層レコードを取得できます。どちらもオブジェクトIDが入手できるので、トランザクションのGetObject()メソッドでオブジェクトに変換します。
まとめ
PowerShell は、テキストファイル、CSVやXMLなど構造を持つファイル、SQLデータベースに容易にアクセスできるので、それらを使った自動作図も気軽にできる。
0 件のコメント:
コメントを投稿