.NET

Reply
Contributor
prmgame
Posts: 12
Registered: ‎08-31-2011
Message 1 of 17 (624 Views)
Accepted Solution

Create DBTEXT element in BackgroundWorker vb .net?

624 Views, 16 Replies
06-06-2012 12:13 PM

Even after much searching and asking for help, I have not come to a solution for creating DBTEXT elements within a BackgroundWorker, this element has problem with the alignment point. So there is an example ZIP to anyone who can help, just run the command and check the elements created, you will see that I'm creating the element with the point in alinahmento MIDLECENTER but the result is not correct.

I am creating other elements in the same way and they had no problems (MTEXT, POLYLINE, CIRCLE, SPLINE, LINE, etc. ..), they are correct, but the element and the element DBTEXT block that contains attributes present problems in the alignment points.

Distinguished Contributor
Artvegas
Posts: 104
Registered: ‎04-21-2011
Message 2 of 17 (599 Views)

Re: Create DBTEXT element in BackgroundWorker vb .net?

06-06-2012 10:40 PM in reply to: prmgame
I ran your code and see what you mean with the alignment not being right. I tried a few things but to avail. I'm curious why you want to multi-thread this. For each DBText item you are including the overhead of a worker thread as well as additional overhead for creating seperate transactions, for what seems a relatively small piece of work. If you were to create the DBText entities in a single transaction on the main thread, i can't imagine much difference in performance. And you would avoid dealing with these kind of issues, particularly as the Autodesk guys openly state that AutoCAD isn't geared for threading with the API's. Are you looking to implement more intensive per item code in the future? If you're just after a way to notify users of your progress you could do this from within your loop, options include AutoCAD's progress bar API component, or using a dispatch call for your custom progress bar (e.g. System.Windows.Forms.Application.DoEvents()).
Distinguished Contributor
Artvegas
Posts: 104
Registered: ‎04-21-2011
Message 3 of 17 (588 Views)

Re: Create DBTEXT element in BackgroundWorker vb .net?

06-07-2012 05:51 AM in reply to: Artvegas
Correction it is a single worker thread with multiple transactions.
Contributor
prmgame
Posts: 12
Registered: ‎08-31-2011
Message 4 of 17 (583 Views)

Re: Create DBTEXT element in BackgroundWorker vb .net?

06-07-2012 06:34 AM in reply to: prmgame

OK I understand, I should create the elements in a single transaction block, perfect, but it does not change the fact that when creating the element within DBTEXT  a Background Worker and the alignment point set to MIDLECENTER results in the element with the point of hanging indent.  I am using Background Worker to perform this process because there is much information and without the Background Worker AutoCAD indicates NOTRESPONDING and we have no idea that while the process is.

 

 See this attachment to get an idea of the problem, and thank you.

Contributor
prmgame
Posts: 12
Registered: ‎08-31-2011
Message 5 of 17 (575 Views)

Re: Create DBTEXT element in BackgroundWorker vb .net?

06-07-2012 06:47 AM in reply to: prmgame

I am using BackgroundWorker because we have thousands of elements to be created in the example represents the element DBTEXT a lot in a court in one state, I am reading data from an xml and caring for autocad, but this process is resulting in NOTRESPONDING, we know that yet the process is running, but we have no idea of ​​progress, so I decided to use BackgroundWorker that worked well until you create the element and DBTEXT BLOCK, gave error in alignment point. Thank you for help!

Distinguished Contributor
Artvegas
Posts: 104
Registered: ‎04-21-2011
Message 6 of 17 (573 Views)

Re: Create DBTEXT element in BackgroundWorker vb .net?

06-07-2012 07:15 AM in reply to: prmgame

One suggestion I have is to look into the DBText.AdjustAlignment() method. There's some information about this one in the ObjectARX docs.

 

I tried to call this within your NewDBText() function but it had no effect. However after running your tool, I iterated model space and called the DBText.AdjustAlignment() method on all of the created DBText entities and this corrected the alignments. Below is the command I used to do this in C#.

 

Is it possible for you to update the aligments seperately after your worker thread has finished adding DBText entities?

 

 

[CommandMethod("DBTextUpdateAlignments")]
public static void DBTextUpdateAlignments()
{
	Document doc = AcApplication.DocumentManager.MdiActiveDocument;
	Database db = doc.Database;

	using (Transaction tr = db.TransactionManager.StartTransaction())
	{
		BlockTableRecord btr = (BlockTableRecord)tr.GetObject(SymbolUtilityServices.GetBlockModelSpaceId(db), OpenMode.ForRead);

		foreach (ObjectId id in btr)
		{
			DBText text = tr.GetObject(id, OpenMode.ForRead) as DBText;
			if (text != null)
			{
				text.UpgradeOpen();
				text.AdjustAlignment(db);
			}
		}

		tr.Commit();
	}
}

 

 

Contributor
prmgame
Posts: 12
Registered: ‎08-31-2011
Message 7 of 17 (558 Views)

Re: Create DBTEXT element in BackgroundWorker vb .net?

06-07-2012 05:28 PM in reply to: Artvegas

Thank you, I will apply this solution to the project, I am very grateful for the attention and time wasted! I'll soon be posting the results!

Contributor
prmgame
Posts: 12
Registered: ‎08-31-2011
Message 8 of 17 (532 Views)

Solved BackgroundWorker X

06-08-2012 09:12 AM in reply to: prmgame

Greetings Artvegas,  I applied the solution you pointed out using the method (AdjustAlignment), it worked perfectly if executed after completion of the process BackgroundWorker.  Unfortunately the same method does not result if used within the process BackgroundWorker, but even being used after the process was fast and solved my problems, so I would like to thank for helping OK.

Distinguished Contributor
Artvegas
Posts: 104
Registered: ‎04-21-2011
Message 9 of 17 (525 Views)

Re: Solved BackgroundWorker X

06-08-2012 09:34 AM in reply to: prmgame
Awesome! Yeah it only worked after completion for me too. Also I was just thinking that you could try to return an ObjectIdCollection from your background worker - i.e. instead of iterating block table records. But maybe you don't need to be that fast :-)
Contributor
prmgame
Posts: 12
Registered: ‎08-31-2011
Message 10 of 17 (511 Views)

Re: Solved BackgroundWorker X

06-08-2012 12:28 PM in reply to: Artvegas

I understand, using the objects rendered in a ObjectIdCollection I could make adjustments more quickly this?

You are not logged in.

Log into access your profile, ask and answer questions, share ideas and more. Haven't signed up yet? Register

Announcements
Welcome to the new Autodesk Community!
If this is your first visit, click here to get started and make the most of the Community. Let us know what you think of the new experience in the Community Feedback Forum.

Need installation help?

Start with some of our most frequented solutions to get help installing your software.

Ask the Community