Aller au contenu

placement cellule en 2 pts


eric45

Messages recommandés

Bonjour,

 

Je voudrais placer des cellules en 2 points: le 1er serait l'origine de la cellule, et le 2ème son orientation mais à distance variable. J'ai bien essayé avec l'option "interactif", mais le 2ème point est en "diagonale" et de plus attend une orientation pour le 3 pt. Est-ce prévu dans Microstation (V8) ? Ou existe t-il une commande ?

 

Merci d'avance

 

Eric

Lien vers le commentaire
Partager sur d’autres sites

J'ai eu le même Pb,

j'ai du me faire une autre adresse pour m'inscrire.

c'est vraiment select microstation.... voir trop select

surtout pour ceux qui ne pipent pas un mot in english...

Je pense qu'ils estiment qu'il faut bac+12 pour s'en servir.

 

A bientot, je t'envoie un mail en mp.

LrDb

Write a book about what ??

Lien vers le commentaire
Partager sur d’autres sites

De ce que je connais de MicroStation il y a la commande placement de cellule interactive ...

1er point : origine de la cellule

entrée au clavier : 1 (échelle X)

entrée au clavier : 1 (échelle Y)

2ième point : orientation

 

la commande c'est : place cell interactive absolute (ou relative)

 

une petite macro peut t'éviter de saisir les échelles ...

Faut voir ce que tu veux exactement ...

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Eric,

c'est fait.

tu peux charger le mdl à l'ouverture de microstation pour l'avoir "sous la main":

Espace de travail>configuration

puis dans catégorie choisi: appl de dessin puis ajoutes celltool.ma.

 

pour compléter YannPro81,

on peut aussi se faire un raccourci clavier avec comme commande:

(en ayant au préalable choisit sa cellule active "ac=macellule" )

"place cell interractive;%d;1;1"

le %d permet d'attendre un datapoint

1 echelle en X

1 echelle en Y

slts

LrDb

Write a book about what ??

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

C'est bon, j'ai copié les fichiers au bon endroit, et en effet ca marche! Le seul truc c'est que la cellule n'a pas sa taille variable, le 2ème point sert juste pour son orientation. Idem pour la commande "place cell interactive;%d;1;1", mais pourrait-on mettre autre chose que "1" pour les échelles, qui donnerait une taille variable?

 

En tout cas, merci encore pour toute l'aide

 

@ +

Eric

Lien vers le commentaire
Partager sur d’autres sites

Si tu veux que ton echelle et ton orientation soient en même temps définie par 2 points,

je ne pense pas, à ma conaissance, que celà soit possible sur V8.

peut être sur V8i? XM?.

si un autre utilisateur se manifeste ?

sinon tu es obligé de faire une echelle par 3 points proportionnelle.

mais tu dois dessiner des cellules de forme rectangulaire, j'imagine ?

est ce que ton Echelle est à chaque fois différente d'un élément à l'autre

 

Write a book about what ??

Lien vers le commentaire
Partager sur d’autres sites

Merci à LrDb

pour la commande :

place cell interactive;%d;1;1

j'avais tenté : place cell interactive;1;1;%d ...

et ça ne marchait pas !!!

pourquoi faut-il inversé alors ???

Cela me semble possible de définir l'échelle par le deuxième point ...

Suffit de faire une petite macro ...

et c'est la distance entre le point 1 et le le point 2 qui définit l’échelle ....

Non ?

pour répondre à eric45

lorsqu'on met 1 c'est l'échelle donc si tu mets 2 tu auras une cellule 2 fois plus grande ...

Ce qui m'embête le plus c'est de devoir définir échelle en X puis échelle en Y !!!

pff ! peuvent pas faire plus simple ...

Dis moi ce dont tu as besoin ...

 

[Edité le 11/5/2011 par YannPro81]

Lien vers le commentaire
Partager sur d’autres sites

à poser dans un module:

Sub Placecell0()
   CommandState.StartPrimitive New p_cell_anG_Sca
End Sub

à poser dans un module de class appelé "p_cell_anG_Sca"

Implements IPrimitiveCommandEvents

Private m_atPoints(0 To 1) As Point3d
Private m_nPoints As Integer
Dim Lg1 As Double
Dim Lg2 As Double

Private Sub IPrimitiveCommandEvents_Cleanup()

End Sub

Private Sub IPrimitiveCommandEvents_DataPoint(Point As Point3d, ByVal View As View)

   If m_nPoints = 0 Then
       CommandState.StartDynamics
       m_atPoints(0) = Point
       m_nPoints = 1
       ShowPrompt "Place end point"
       Dim cel1 As CellElement
       Set cel1 = CreateCellElement2(ActiveSettings.CellName, m_atPoints(0), Point3dFromXY(1, 1), True, Matrix3dIdentity)
       Lg1 = cel1.Range.High.X - m_atPoints(0).X
   ElseIf m_nPoints = 1 Then
       m_atPoints(1) = Point
       Dim oCel As CellElement
       Set oCel = CreateCellElement2(ActiveSettings.CellName, m_atPoints(0), Point3dFromXY(Lg2 / Lg1, Lg2 / Lg1), True, Matrix3dFromAxisAndRotationAngle(2, Atn2(m_atPoints(1).Y - m_atPoints(0).Y, m_atPoints(1).X - m_atPoints(0).X)))
       ActiveModelReference.AddElement oCel
       oCel.Redraw
       m_atPoints(0) = m_atPoints(1)
   End If

End Sub


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 oCel As CellElement
       Lg2 = Abs(Point3dDistance(m_atPoints(0), Point))
      Set oCel = CreateCellElement2(ActiveSettings.CellName, m_atPoints(0), Point3dFromXY(Lg2 / Lg1, Lg2 / Lg1), True, Matrix3dFromAxisAndRotationAngle(2, Atn2(Point.Y - m_atPoints(0).Y, Point.X - m_atPoints(0).X)))
       oCel.Redraw DrawMode
       Dim oEl As LineElement
       Set oEl = CreateLineElement1(Nothing, m_atPoints)
       oEl.Redraw DrawMode
   End If
End Sub

Private Sub IPrimitiveCommandEvents_Keyin(ByVal Keyin As String)

End Sub

Private Sub IPrimitiveCommandEvents_Reset()
   CommandState.StartPrimitive Me
   m_nPoints = 0
End Sub

Private Sub IPrimitiveCommandEvents_Start()
   ShowCommand "FROM VBA PlaceLine Example"
   ShowPrompt "Point d'insertion de la cellule"
End Sub 

 

me suis inspiré du placement d'une ligne donné en exemple

a bientôt

LrDb

Write a book about what ??

Lien vers le commentaire
Partager sur d’autres sites

Amélioration quelquesoit le point d'insertion:

Module principal

Sub Placecell0()
If ActiveSettings.CellName = "" Then
MsgBox "no active cell"
Exit Sub
End If
Dim oCel As CellElement
Set oCel = CreateCellElement2(ActiveSettings.CellName, Point3dZero, Point3dFromXY(1, 1), True, Matrix3dIdentity)
If oCel.Range.Low.X - oCel.Range.High.X = 0 Then
MsgBox "invalide cell"
Exit Sub
End If
   CommandState.StartPrimitive New p_cell_anG_Sca
End Sub 

module de class:

     

Implements IPrimitiveCommandEvents
Private m_atPoints(0 To 1) As Point3d
Private m_nPoints As Integer
Dim Lg2 As Double
Dim LgPt As Double
Dim Algpt As Double
Dim Propp As Double
Private Sub IPrimitiveCommandEvents_Cleanup()
End Sub
Private Sub IPrimitiveCommandEvents_DataPoint(Point As Point3d, ByVal View As View)
   If m_nPoints = 0 Then
       CommandState.StartDynamics
       m_atPoints(0) = Point
       m_nPoints = 1
       ShowPrompt "Place end point"
       CadInputQueue.SendKeyin "set prompt entrez AX="
       Dim cel1 As CellElement
       Set cel1 = CreateCellElement2(ActiveSettings.CellName, m_atPoints(0), Point3dFromXY(1, 1), True, Matrix3dIdentity)
       LgPt = Abs(Point3dDistance(cel1.Range.Low, cel1.Origin))
       Algpt = Atn2(cel1.Origin.Y - cel1.Range.Low.Y, cel1.Origin.X - cel1.Range.Low.X)
       Propp = Abs(cel1.Range.Low.X - cel1.Range.High.X)
   ElseIf m_nPoints = 1 Then
       m_atPoints(1) = Point
       Dim oCel As CellElement
       Set oCel = CreateCellElement2(ActiveSettings.CellName, Point3dAddAngleDistance(m_atPoints(0), Algpt + Atn2(m_atPoints(1).Y - m_atPoints(0).Y, m_atPoints(1).X - m_atPoints(0).X), LgPt * Lg2 / Propp, 1), Point3dFromXY(Lg2 / Propp, Lg2 / Propp), True, Matrix3dFromAxisAndRotationAngle(2, Atn2(m_atPoints(1).Y - m_atPoints(0).Y, m_atPoints(1).X - m_atPoints(0).X)))
       ActiveModelReference.AddElement oCel
       oCel.Redraw
       m_atPoints(0) = m_atPoints(1)
   End If

End Sub

Private Sub IPrimitiveCommandEvents_Dynamics(Point As Point3d, ByVal View As View, ByVal DrawMode As MsdDrawingMode)
CommandState.ParseAll = False
   If m_nPoints = 1 Then
       m_atPoints(1) = Point
       Dim oCel As CellElement
       Lg2 = Abs(Point3dDistance(m_atPoints(0), Point))
       Set oCel = CreateCellElement2(ActiveSettings.CellName, Point3dAddAngleDistance(m_atPoints(0), Algpt + Atn2(m_atPoints(1).Y - m_atPoints(0).Y, m_atPoints(1).X - m_atPoints(0).X), LgPt * Lg2 / Propp, 1), Point3dFromXY(Lg2 / Propp, Lg2 / Propp), True, Matrix3dFromAxisAndRotationAngle(2, Atn2(m_atPoints(1).Y - m_atPoints(0).Y, m_atPoints(1).X - m_atPoints(0).X)))
       oCel.Redraw DrawMode
       Dim oEl As LineElement
       Set oEl = CreateLineElement1(Nothing, m_atPoints)
       oEl.Redraw DrawMode
   End If
End Sub
Private Sub IPrimitiveCommandEvents_Keyin(ByVal Keyin As String)
MsgBox Keyin
End Sub
Private Sub IPrimitiveCommandEvents_Reset()
   CommandState.StartPrimitive Me
   m_nPoints = 0
End Sub
Private Sub IPrimitiveCommandEvents_Start()
   ShowCommand "FROM VBA PlaceLine Example"
   ShowPrompt "Point d'insertion de la cellule"
End Sub

 

write a book about what ??

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Salut,

Assez rigolo qu'un aussi bon logiciel comme Microstation, traine toujours les même petits défauts qui lui on couté si cher !

Pour le côté vintage, cette routine date de 1998 (Microstation SE)

Cette histoire de rotation des blocs nous avais beaucoup emmerdé à l'époque ...

 

En tout cas, tous les bureau d'étude de plus de 10 personne, travailiant sous Autocad, dervrait avoir une licence Ustation : Seul Ustation est capable de réparer les erreurs générées par autocad sur ses propres fichiers ...

 

' Insere la cellule en mode relatif "cellname" à l'échelle "xscel" et "yscale"
' et à l'angle de rotation "aro"

Sub main
   Dim startPoint As MbePoint
   Dim point As MbePoint, point2 As MbePoint
   Dim status%
   Dim view%
   Dim numArgs As Integer
   Dim cellname As String
   Dim xscale As String
   Dim yscale As String
   Dim aro As String
   

'   save the command line arguments to a local variable
   cmd$ = Command$

'   save the number of arguments in a local variable
   numArgs = WordCount(cmd$)

'   parse the command line arguments and output each individual argument in turn
   cellname = Word$ (cmd$, 1)
   xscale = Word$ (cmd$, 2)
   yscale = Word$ (cmd$, 3)
   aro = Word$ (cmd$, 4)

'début de la boucle
Do
   'lance la commande
   MbeSendKeyin "place cell interactive relative"

   'envoi le nom de la cellule
   MbeSetAppVariable "", "tcb->activecell", cellname

 
      '   Wait for a data point or a reset
       MbeGetInput MBE_DataPointInput, MBE_ResetInput
       

       '   if a reset was entered, exit the loop
       if MbeState.inputType = MBE_ResetInput then Exit Do


       '   Extract the data point coordinates and view
       status = MbeState.getInputDataPoint (startPoint,view)

       '   Send a data point to the current command
       MbeSendDataPoint startPoint, view
       
   'envoi l'echelle x
   MbeSendKeyin xscale
   
   'pareil pour y
   MbeSendKeyin yscale
   'et l'angle de rotation
   MbeSendKeyin aro

   MbeSendReset
   
Loop
   
End Sub

----------------------------------------------------------------------

Site: https://www.g-eaux.fr

Blog: http://g-eaux.over-blog.com

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité