Hello,
I have a problem.
I want to AutoCAD do not lock it's space, when my Form is shown on display.
But I have an exception when I use modeless dialog.
public void MyCommand ()
{
//-------------------------------------------------
// Using this code, my program works fine, but locks modal space of AutoCAD
System.Windows.Forms.Application.EnableVisualStyles ();
System.Windows.Forms.Application.Run (new Form1 ());
// I want to use this instruction to do not lock modal space
// Autodesk.AutoCAD.ApplicationServices.Application.ShowModelessDialog (new Form1 ());
//-------------------------------------------------
}
If I use modeless dialog I can read and write from acad prompt and create block; BUT I can't create BlockReference.
I get an exception "eLockViolation" in the next code instructions:
//------------------------------------------------------------------------------------------------------------------------------
public void CreateBlockReference (string strBlockName, Point3d Origin)
{
using( Transaction t = db.TransactionManager.StartTransaction () )
{
BlockTable btTable = (BlockTable)t.GetObject (db.BlockTableId, OpenMode.ForRead); // <--- EXCEPTION
BlockTableRecord btrModelSpace = (BlockTableRecord)t.GetObject (
btTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
if( !btTable.Has (strBlockName) )
{
ed.WriteMessage (string.Format (msgs.BlockNoExist,strBlockName));
throw new Exception (ErrorStatus.MissingBlockName,
string.Format (msgs.BlockNoExist,strBlockName));
}
ObjectId myBlockId = btTable[strBlockName];
BlockReference brRefBlock = new BlockReference (Origin, myBlockId);
btrModelSpace.AppendEntity (brRefBlock);
t.AddNewlyCreatedDBObject (brRefBlock, true);
t.Commit ();
} // end using
}
//------------------------------------------------------------------------------------------------------------------------------
Please, help me.
Thank you.
Solved! Go to Solution.
I found right answer:
/// <summary></summary>
/// <param name="strBlockName"></param>
/// <param name="Origin"></param>
public void CreateBlockReference (string strBlockName, Point3d Origin)
{
DocumentLock dl = Application.DocumentManager.MdiActiveDocument.LockDocument ();
using( Transaction t = db.TransactionManager.StartTransaction () )
{
BlockTable btTable = (BlockTable)t.GetObject (db.BlockTableId, OpenMode.ForRead);
BlockTableRecord btrModelSpace = (BlockTableRecord)t.GetObject (
btTable[BlockTableRecord.ModelSpace], OpenMode.ForWrite);
if( !btTable.Has (strBlockName) )
{
ed.WriteMessage (string.Format (msgs.BlockNoExist,strBlockName));
throw new Exception (ErrorStatus.MissingBlockName,
string.Format (msgs.BlockNoExist,strBlockName));
}
ObjectId myBlockId = btTable[strBlockName];
BlockReference brRefBlock = new BlockReference (Origin, myBlockId);
btrModelSpace.AppendEntity (brRefBlock);
t.AddNewlyCreatedDBObject (brRefBlock, true);
t.Commit ();
} // end using
dl.Dispose ();
}
yes, use DocumentLock in a model or modeless dialouge.
Can't find what you're looking for? Ask the community or share your knowledge.