How to using Modeless form in AutoCAD

How to using Modeless form in AutoCAD

Anonymous
Not applicable
1,063 Views
2 Replies
Message 1 of 3

How to using Modeless form in AutoCAD

Anonymous
Not applicable

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.

0 Likes
Accepted solutions (1)
1,064 Views
2 Replies
Replies (2)
Message 2 of 3

Anonymous
Not applicable
Accepted 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 ();
}

0 Likes
Message 3 of 3

Daniel.Du
Alumni
Alumni

yes, use DocumentLock in a model or modeless dialouge.



Daniel Du
Developer Technical Services
Autodesk Developer Network

0 Likes