Hi all,
Trying to work out how to place a predefined text string onto the drawing, without bring up any menus or options.
Have tried
CadInputQueue.SendKeyin "place text" CadInputQueue.SendKeyin sText
But the keyin window appears and i cant work out how to close it.
Also have tried
CadInputQueue.SendKeyin "place dialogtext icon" CadInputQueue.SendMessageToApplication "WORDPROC", sText
Which brings up the word processor but doesn't input the text.
Ideally i'd like to simple click a button on a form and the text appears on the drawing at the cursor ready for the user to select the location.
Cheers,
Rob
Unknown said: CadInputQueue.SendKeyin "place text" CadInputQueue.SendKeyin sText
In general, if you queue a user key-in using VBA then the result is the same as if you performed that task manually. In other words, MicroStation can't distinguish between you typing place dialogtext icon and VBA queueing place dialogtext icon.
If a key-in causes MicroStation to pop a dialog, then it will pop that dialog.
If you want to avoid the consequents of a user key-in, then use VBA to create objects directly, in the way that others have suggested. Search VBA help for examples. Searching for CreateTextElement1 reveals an example under topic Elements and Levels.
Regards, Jon Summers LA Solutions
Answer Verified By: Rob Golding
Thanks for the replies. Has basically got what i wanted.
The only thing is that i would like the user to place the text where they would like, is there a way i can put the new text element to the cursor and have the user select the point? rather than define the point?
You must have Procedures for all Procedures defined in your Interface.
(Just click them all once in our VBA IDE.)
You guys are absolute legends!
All working. Many thanks for helping out!
Just a bit further to this... the client has asked if its possible to show a preview of the text on the screen (i personally think its not needed but hey they pay the bills so least i can do is ask)
In the above, I know that VBA doesn't actually create the text element until the datapoint is clicked, so i'm not sure if this is possible.
They basically want to be able to see where the text is going to be placed, so much like the text already predefined at the cursor just waiting for a insertion point.
Any ideas?
Thanks again!
Hi Rob,
you can display dynamic elements when Primitive Command is active. The right place to do it is Dynamics methods in IPrimitiveCommandEvents, because this method is called everytime the cursor is moved.
You can check for example Line Element Creation Command example in MicroStation VBA help to see how to do it.
If there is no dynamic, Transient Elements can be used to display elements that don't exist in design file.
With regards,
Jan
Bentley Accredited Developer: iTwin Platform - AssociateLabyrinth Technology | dev.notes() | cad.point
Thanks Jan. I have had a look at the example and it was helpful but still couldn't give the result the client wants.
Below is the code that i have pieced together from the example and also from what the guys helped me with above. The exact code below, essentially work the same as before
If i add another "ActiveModelReference.AddElement otext" into the Dynamics section, then its achieves sort of what i'm after, where the text is placed at the cursor, however everytime the mouse is moved it will place the text... ending up with hundreds of text elements on the design.
Is there anything from below that could be changed to get the result the client wants?
I have seen a few programs (i think it was part of an MDL) that could do exactly as im after so i assume this is possible?
Implements IPrimitiveCommandEventsPrivate m_strText As StringPrivate m_atPoints(0 To 1) As Point3dPrivate m_nPoints As IntegerPublic Property Let Text(s As String) m_strText = sEnd PropertySub IPrimitiveCommandEvents_Datapoint(Point As Point3d, ByVal oView As View)
If m_nPoints = 0 Then CommandState.StartDynamics m_atPoints(0) = Point m_nPoints = 1 ShowPrompt "Place end point" ElseIf m_nPoints = 1 Then m_atPoints(1) = Point Dim otext As TextElement Set otext = CreateTextElement1(Nothing, m_strText, Point, Matrix3dIdentity) ActiveModelReference.AddElement otext otext.Redraw msdDrawingModeNormal m_atPoints(0) = m_atPoints(1) End IfEnd SubPrivate Sub IPrimitiveCommandEvents_Dynamics(Point As Point3d, ByVal View As View, ByVal DrawMode As MsdDrawingMode) If m_nPoints = 1 Then m_atPoints(1) = Point Dim otext As TextElement Set otext = CreateTextElement1(Nothing, m_strText, Point, Matrix3dIdentity) otext.Redraw msdDrawingModeNormal End IfEnd Sub
Private Sub IPrimitiveCommandEvents_Keyin(ByVal Keyin As String)
End Sub
Private Sub IPrimitiveCommandEvents_Reset() CommandState.StartPrimitive Me m_nPoints = 0End Sub
Private Sub IPrimitiveCommandEvents_Start() ShowPrompt "Select insertion point for text"End Sub
Unknown said:If i add another "ActiveModelReference.AddElement otext" into the Dynamics section
You never can do that. _Dynamics method is called when a cursor is moved, which means it can happen tens times every second. _DataPoint is the best place to add element into a model.
Unknown said:Is there anything from below that could be changed to get the result the client wants?
This thread has become pretty long and it's hard to find out what your client wants. Can you describe step by step how the tool should work ? Something like (just an example):
What I miss in the information available is a definition how mouse buttons should work.
Hi Jan,
The Steps listed above are correct apart from number 1.
Some small corrections:
Private Sub IPrimitiveCommandEvents_Dynamics(Point As Point3d, ByVal View As View, ByVal DrawMode As MsdDrawingMode)
If m_nPoints = 1 Then
m_atPoints(1) = Point
Dim otext As TextElement
Set otext = CreateTextElement1(Nothing, m_strText, Point, Matrix3dIdentity)
otext.Redraw msdDrawingModeTemporary
End If
Private Sub IPrimitiveCommandEvents_Reset()
'Better to do a clear reinitialization
CommandState.StartPrimitive New MyClass()
m_nPoints = 0
few notes (not sitting at my computer, so sorry, no code):
Regards,
Got you wrong Rob.
I thought you wanted to place a line and a text.
Please find a example attached.
CreateText.mvba
Perfect Stefan!
Only 1 small problem though, when the reset button is clicked nothing happens.
Is it ok to simply add in " CommandState.StartDefaultCommand"
or when working with classes is it best to do it another way?