Aller au contenu

Màj safearray bloc dynamique


bseb67

Messages recommandés

salut!

 

Ben voilà, je coince sur un truc depuis hier, j'ai des recherches pour savoir comment construire

mes nouvelles données, mais autocad me renvoie:

erreur: Erreur Automation Entrée incorrecte

 

J'ai un bloc dynamique, j'arrive à le poser où je veux, mais il faut que j'adapte sa forme.

Il comporte 6 propriétés: 4 doubles et 2 safearry de double, qui sont en fait des coordonnées 3D.

; on choisit le bloc
(setq ename (car (entsel)))
(setq e (vlax-ename->vla-object ename))
;; récupérer les propriétés du bloc dynamique dans une liste
(setq dbp (vla-getdynamicblockproperties e))
(setq dbp (vlax-variant-value dbp))
(setq dbp (vlax-safearray->list dbp))

 

Puis avec un while je boucle sur les propriétés. J'arrive à modifier les doubles avec:

(vlax-put-property (nth cpt dbp) 'Value k)

 

Mais pour les 2 points, niet :(.

Pourtant je créer bien des données au même format que celles contenues dans le bloc:

(vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 2))

(list 0.0 (* 1000.0 (distance impact PM)) 0.0)))

Qui me renvoie bien un variant contenant un safearray de 3 doubles.

 

Merci d'avance pour l'aide.

 

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Salut

Tu peux simplifier

(setq dbp (vla-getdynamicblockproperties e))
(setq dbp (vlax-variant-value dbp))
(setq dbp (vlax-safearray->list dbp))

par

(setq dbp (vlax-invoke e 'getdynamicblockproperties))

Par contre, je ne comprends pas ce que tu veux faire :(

Si tu as un exemple avec une explication plus clair qu'en termes techniques avec les Vlax-vbDouble,... (qu'on pourra ensuite aborder, mais il faut déjà comprendre ce que tu souhaites faire comme manip)

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Salut Patrick_35 et merci d'avance pour l'aide.

 

J'ai fait des copies d'écran pour montrer ce que je cherche à faire.

Au départ lorsque j'insère mon bloc cotation j'ai ceci:

http:// http://bseb67.free.fr/cadxp/bloc_dyn_cotation/bloc_depart.PNG

 

Ce que je cherche à faire c'est un fait coter les hauteurs des réseaux, donc de faire cela:

http:// http://bseb67.free.fr/cadxp/bloc_dyn_cotation/modification.PNG

 

Afin d'obtenir à l'arrivée ceci:

http:// http://bseb67.free.fr/cadxp/bloc_dyn_cotation/bloc_final.PNG

 

Sauf que, comme je n'arrive pas à modifier les points ORI1 et ORI2, le résultat n'est pas celui voulu:

http:// http://bseb67.free.fr/cadxp/bloc_dyn_cotation/demi_resultat.PNG

 

Voilà, j'espère être plus clair ainsi. ;)

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Salut

C'est plus claire comme illustration :)

 

Testons

(vlax-put (nth 8 dbp) 'value (mapcar '- '(840.0 285.0 0.0) (vlax-get e 'insertionpoint)))

ou

(vla-put-value (nth 8 dbp) (vlax-3d-point (mapcar '- '(840.0 285.0 0.0) (vlax-get e 'insertionpoint))))

J'ai aussi cette erreur :(

 

Bon, on va essayer en changeant la distance, mais que nenni

(vlax-put (nth 0 dbp) 'value 110.0)

ou

(vla-put-value (nth 0 dbp) 110.0)

J'ai nil en retour et rien n'a changé :casstet:

 

Je continue de chercher

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

moi ce qui m'énerve le plus c'est qu'en le faisant à la souris ca marche, et si cela ne fonctionne

avec du code lisp ou vlisp, c'est vraiment pourri! :mad:

Lundi j'ai fait mon lisp pour calculer le point d'insertion du bloc , c'est plus facile de développer

des méthodes mathématiques que de modifier les données.

 

Depuis hier je visite toutes les pages possibles sur google pour trouver quelqu'un qui a trouvé

l'astuce.

 

Merci encore pour l'aide.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Ben c'est pratiquement ce que je fais:

 
(while (< cpt lg)

   	; on test le nom de la propriété
   	(setq propname (vlax-get (nth cpt dbp) 'PropertyName))
   	(cond
  	((= (strcase propname) "DISTANCE")
	 	(vlax-put-property (nth cpt dbp) 'Value (distance (setq PM (getpoint)) (setq impact (getpoint))))
	)
	((and (= (strcase propname) "ORIGIN") (= cpt 1))
	 	(vla-put-value (nth cpt dbp) (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 2))
				       (list 0.0 (* 1000.0 (distance impact PM)) 0.0))))
	)
  	((= (strcase propname) "POSITION X")
	 	(vlax-put-property (nth cpt dbp) 'Value 0.1)
	)
	((= (strcase propname) "POSITION Y")
	 	(vlax-put-property (nth cpt dbp) 'Value (distance impact PM))
	)
	((= (strcase propname) "DISTANCE NGF")
	 	(vlax-put-property (nth cpt dbp) 'Value 0.0)	
	)
	((and (= (strcase propname) "ORIGIN") (= cpt 5))
	 	(vlax-put-property (nth cpt dbp) 'Value
		  (vlax-make-variant (vlax-safearray-fill (vlax-make-safearray vlax-vbDouble '(0 . 2))
				       (list 300.0 0.0 0.0))))
	)
) ; cond
   
   	; on incrémente cpt
   	(setq cpt (1+ cpt))
) ; while

 

Ce que je trouve bizarre aussi, c'est que les doubles sont en mètres, alors que les coordonnées des deux points sont apparemment en millimètres. :casstet:

 

a+

 

Edit:

J'ai oublié le test débile qui permet de vérifier:

(vla-put-value (nth cpt dbp) (vla-get-value (nth cpt dbp)))

Et bien autocad me jette aussi avec le même message :mad: :o

 

[Edité le 10/1/2008 par bseb67]

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Re,

C'est bon, j'ai réussi.

 

Je n'avais pas vu dans l'exemple que j'avais pris que j'ai comme valeurs imposées

AllowedValues (RO) = (100.0 101.0 103.0 127.0 133.0 140.0 ... )

Ce qui fait que si je rentre une de ces valeurs

(vlax-put (nth 0 dbp) 'value 100.0)

un

(vlax-get (nth 8 dbp) 'value)

me retourne (44.6926 95.4426 0.0)

 

Pour vérifier, je fais

(vlax-put (nth 0 dbp) 'value 140.0)

et un

(vlax-get (nth 8 dbp) 'value)

me retourne (64.6926 95.4426 0.0)

Ma valeur X a bien changé :)

 

ps : comme exemple de bloc dynamique, j'ai utilisé le bloc "Poutre à larges ailes - Métrique" du fichier "Structural - Metric.dwg" se trouvant dans le répertoire "Sample\Dynamic Blocks"

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

En changeant la longueur, le point d'origine bouge :o !

Ca m'a l'air bizarre, car tu mets 100 puis 140, mais la valeur en X ne bouge pas de 40, mais de 20,

la moitié. Donc j'en déduis que les deux poignées bougent de chaque côté, et chacune de 20.

 

 

; IAcadDynamicBlockReferenceProperty: Interface Propriétés de blocs dynamiques

d'AutoCAD

; Valeurs de propriétés:

; AllowedValues (RO) = nil

; Description (RO) = ""

; PropertyName (RO) = "Distance"

; ReadOnly (RO) = 0

; Show (RO) = -1

; UnitsType (RO) = 2

; Value = 3.3

; Aucune méthode

 

Pour mon bloc, je n'ai aucune valeur définie dans allowedvalues. Quand j'édite le bloc que tu as utilisé, waouh :o ! Je ne piges pas grand chose.

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

Lien vers le commentaire
Partager sur d’autres sites

Re,

D'après ce que je comprends, il faut calculer la distance x et la distance y entre le point d'origine et le point de destination.

Puis, il faut additionner ces valeurs à la longueur x et la hauteur (ou largeur) y du bloc via le vlisp et totocad recalcul le nouveau point d'origine. Il aurait plus simple d'entrer directement le nouveau point, mais bon :( , on utilise ce qui marche.

 

@+

Les Lisps de Patrick

Le but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.

Joseph Joubert, 1754-1824

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

En fait je vais recréer le bloc dynamique en fintant, j'inverse le point d'origine que je n'arrive pas à bouger avec l'autre point du paramètre linéaire => et ca marche! :D

 

Si j'ai le temps je mettrai un post pour le challenge sur les polygone puis sur le tri.

 

Merci encore pour le soutien ;)

Tous pour lisp, Lisp pour tous!

Avec Revit, cela ne vas trop vite...

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é