Issue
Database.CurrentSpaceId プロパティでアクティブなレイアウトのレイアウト(ペーパー空間)の BlockTableRecord を取得して、対応する Layout を得ています。
[CommandMethod("GetLayoutId", CommandFlags.NoTileMode | CommandFlags.Modal)]
public void GetLayoutId()
{
Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;
using (Transaction acTr = acCurDb.TransactionManager.StartTransaction())
{
ObjectId objId = acCurDb.CurrentSpaceId;
BlockTableRecord oRec = (BlockTableRecord)acTr.GetObject(objId, OpenMode.ForRead);
if (oRec.IsLayout)
{
Layout oLay = (Layout)acTr.GetObject(oRec.LayoutId, OpenMode.ForRead);
acDocEd.WriteMessage("\nCurrent LayoutId:{0}, Tab Name:{1}", oLay.ObjectId.ToString(), oLay.LayoutName);
}
acTr.Commit();
}
}
ただ、レイアウト上のビューポートでモデル空間がアクティブになっていると、モデル空間を表す BlockTableRecord に対するレイアウト名(モデル空間のタブ名「モデル」は英語の「Model」)が表示されてしまいます。
ビューポートでモデル空間がアクティブな状態でも、アクティブなレイアウトに対応する Layout を得ることは出来るでしょうか?
Solution
Database.CurrentSpaceId プロパティは、アクティブな空間の ID を返すプロパティです。
アクティブなレイアウトタブに対応する BlockTableRecord の ID を得るためには、システム変数 CTAB を利用することが出来ます。
[CommandMethod("GetLayoutId2", CommandFlags.NoTileMode | CommandFlags.Modal)]
public void GetLayoutId2()
{
Database acCurDb = Application.DocumentManager.MdiActiveDocument.Database;
Editor acDocEd = Application.DocumentManager.MdiActiveDocument.Editor;
string strLay = (string)Application.GetSystemVariable("CTAB");
using (Transaction acTr = acCurDb.TransactionManager.StartTransaction())
{
BlockTable oTbl = (BlockTable)acTr.GetObject(acCurDb.BlockTableId, OpenMode.ForRead);
Layout oLay;
BlockTableRecord oRec;
foreach (ObjectId objId in oTbl)
{
oRec = (BlockTableRecord)acTr.GetObject(objId, OpenMode.ForRead);
if (oRec.IsLayout)
{
oLay = (Layout)acTr.GetObject(oRec.LayoutId, OpenMode.ForRead);
if (oLay.LayoutName == strLay)
acDocEd.WriteMessage("\nCurrent LayoutId:{0}, Tab Name:{1}", oLay.ObjectId.ToString(), strLay);
}
}
acTr.Commit();
}
}
記事全体を表示