Aller au contenu

Compare 2 plans


vinz34

Messages recommandés

Bon, je déclare forfait pour tester les blocs dans leurs tables respectives.

Le code s'en trouve beaucoup trop alourdi et le temps aussi.

 

J'ai rajouté un contrôle du nombre d'entités dans le bloc et corrigé les bugs rencontrés au fil des tests.

 

Voici la dernière version :

 

;;; par Vincent Dufournaud (vinz34)
;;; mrvd34@hotmail.com
;;;créé le 16.04.2008
;;;modifié le 02.05.2008 : (compare les attributs et analyse par Object.dbx
;;;modifié le 06.05.2008 : corrections d'erreurs, ajout de comparaison du nombre d'entité
dans les blocs.
;;;modifié le 10.06.2009 : ajout de la vérification des calques d'entités

(vl-load-com)

(defun c:cdwg (/       app     cdoc    fichier dbx     name    sp1
       sp2     e       obj     lstmodif	       lstajout
       lstsuppr	       lst     obj     sup     h
      )

 (setq	app  (vlax-get-acad-object)
cdoc (vla-get-activedocument app)
name (vla-get-fullname cdoc)
s    (getvar "date")
t1   (* 86400.0 (- s (fix s)))
 )

 (while (not fichier)
   (setq fichier
   (getfiled
     "Sélection de l'ancien plan"
     (strcat (vl-filename-directory (vla-get-fullname cdoc))
	     "/"
     )
     "dwg"
     4
   )
   )
 )

 (vla-open (if	(< (atoi (substr (getvar "ACADVER") 1 2)) 16)
      (setq dbx (vlax-create-object "ObjectDBX.AxDbDocument"))
      (setq dbx	(vlax-create-object
		  (strcat "ObjectDBX.AxDbDocument."
			  (substr (getvar "ACADVER") 1 2)
		  )
		)
      )
    )
    fichier
 )

 (vla-saveas
   cdoc
   (strcat (substr name 1 (- (strlen name) 4))
    " Modications"
   )
 )

 (setq	sp1 (vla-get-modelspace cdoc)
sp2 (vla-get-modelspace dbx)
 )

 (vlax-for lay	(setq layers (vla-get-layers cdoc))
   (vlax-put lay 'color 253)
   (vla-put-lock lay :vlax-false)
 )

 (vlax-for lay	(vla-get-layers dbx)
   (vla-put-lock lay :vlax-false)
 )

 (vlax-for ent	sp1
   (setq lst1 (cons ent lst1))
 )

 (defun equal-objects (obj1 obj2)
   (vl-every
     (function
(lambda	(p)
  (and
    (or
      (not (vlax-property-available-p obj1 p))
      (equal (vlax-get obj1 p)
	     (vlax-get obj2 p)
	     1e-9
      )
    )
    (or
      (not
	(and (= (vla-get-ObjectName obj1) "AcDbBlockReference")
	     (= (vla-get-HasAttributes obj1))
	)
      )
      (and
	(vl-every 'equal-objects
		  (vlax-invoke obj1 'getAttributes)
		  (vlax-invoke obj2 'getAttributes)
	)
	(= (vla-get-count
	     (vla-item (vla-get-blocks cdoc) (vla-get-name obj2))
	   )
	   (vla-get-count
	     (vla-item (vla-get-blocks dbx) (vla-get-name obj1))
	   )
	)
      )
    )
  )
)
     )
     '(ObjectName     Center	      Radius	     Coordinates
StartPoint     EndPoint	      StartAngle     EndAngle
MajorAxis      RadiusRatio    TextString     InsertionPoint
Width	       Height	      Rotation	     XScaleFactor
YScaleFacor    ZScaleFactor     Layer
      )
   )
 )

 (vlax-put (vla-add layers "0.Ajouts") 'color 172)
 (vlax-put (vla-add layers "0.Modications") 'color 10)
 (vlax-put (vla-add layers "0.Suppressions") 'color 92)

 (vlax-for ent	sp2
   (if	(handent (setq h (vla-get-handle ent)))
     (if (entget (handent h))
(progn
  (setq e (vla-handletoobject cdoc h))
  (cond	((and (not (equal-objects ent e))
	      (vlax-property-available-p e 'layer)
	 )
	 (vla-put-layer e "0.Modications")
	)
  )
  (setq lst1 (vl-remove e lst1))	  
)
(vla-put-layer
  (car (vlax-invoke dbx 'CopyObjects (list ent) sp1))
  "0.Suppressions"
)
     )
     (vla-put-layer
(car (vlax-invoke dbx 'CopyObjects (list ent) sp1))
"0.Suppressions"
     )
   )
 )

 (if lst1
   (foreach n lst1
     (cond ((vlax-property-available-p e 'layer)
     (vla-put-layer n "0.Ajouts")
    )
     )
   )
 )

 (vlax-for b (vla-get-blocks cdoc)
   (vlax-for i	b
     (vla-put-color i 256)
   )
 )

 (vlax-release-object dbx)
 (vla-purgeall cdoc)
 (vla-save cdoc)
 (setq	s  (getvar "date")
t2 (* 86400.0 (- s (fix s)))
tt (- t2 t1)
 )

 (if (> tt 60)
   (progn
     (setq sec	(rem tt 60)
    mn	(strcat (rtos (/ (- tt sec) 60) 2 0) " mn ")
    sec	(strcat (rtos sec 2 0) " s")
     )
   )
   (progn
     (setq sec	(strcat (rtos tt 2 0) " s")
    mn	"0 mn "
     )
   )
 )

 (alert
   (strcat
     "Plan de repérages des modifications\n\nLes ajouts sont en vert\nLes modifications en rouge\nLes suppressions en bleu\n\nTemps d'éxecution : "
     mn
     sec
   )
 )
)

 

Si vous rencontrez des messages d'erreurs, merci de les signaler.

 

Tout commentaire reste le bienvenu.

 

 

 

[Edité le 10/6/2009 par vinz34]

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à toutes et tous,

 

D'après le peu de test réalisé, tout semble fonctionner.

Une remarque : Si on lance la routine, dans la BD "Selection de l'ancien plan", on ne peut pas décider de stopper la manip,.. ?

 

Beug ou voulu ?

 

Merci encore de ce partage vinz34

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Re,

 

Avec des objets créés sous Architecture =>

 

Commande: cdwg

Chargement de Base AEC...

Chargement de Base étendue AEC...

Chargement de IU base AEC...

Chargement de Base du projet AEC...

Chargement de Données de nomenclature AEC...

Chargement de Base architecturale AEC...

Chargement de Base de structure AEC...

Chargement de Base d'aires AEC...

Chargement de Base des cotes AEC...

Chargement de Nomenclature AEC...; [surligneur] erreur: type d'argument incorrect:

VLA-OBJECT nil[/surligneur]

 

Que se passe t-il alors ?

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Une remarque : Si on lance la routine, dans la BD "Selection de l'ancien plan", on ne peut pas décider de stopper la manip,.. ?

 

Beug ou voulu ?

 

C'est un choix suite à la remarque de (gile) :

 

Juste une petite remarque, il n'y a pas de contrôle au cas où l'utilisateur ferait "Annuler" dans la boite de dialogue getfiled.

 

J'ai choisi de mettre une boucle plûtot qu'un if comme me le conseillait (gile).

 

Tu peux toujours remplacerle while par un if.

 

[Edité le 14/5/2008 par vinz34]

Lien vers le commentaire
Partager sur d’autres sites

Bonsoir à toutes et tous,

 

Ok ! Merci de ta réponse vinz34.

 

PS: Je pense que tu as du oublier de fermer une balise,...

 

Merci encore, ton lisp est vraiment super pratique et semble globalement fiable (hormis les blocs mais c'est normal à ce stade si j'ai bien compris).

 

Au plaisir,

Civil 3D 2024 - COVADIS_18.2

https://www.linkedin...3%ABt-95313341/

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Bien vu pour la balise, c'est corrigé.

 

Pour ton erreur du type erreur: type d'argument incorrect:VLA-OBJECT nil , je pense l'avoir trouvé, je fais encore des tests et je modifierai le code en conséquence.

 

Au sujet des blocs je n'abandonne pas mais je manque de temps.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...
  • 5 mois après...

Bonjour,

 

Il m'arrrive d'avoir quelques soucis avec cette routine.

 

Lorsque j'utilise cette routine avec un simple dessin (5 à 6 objets), elle fonctionne sans problème.

 

Par contre lorsque je l'utilise avec un plan archi par exemple Autocad plante quelque fois.

 

Quelqu'un arrait-il une idée.

 

Merci

Excalibur

Lien vers le commentaire
Partager sur d’autres sites

  • 7 mois après...

Bonjour vinz34

 

J'ai testé votre lisp et c'est super top, ça fonctionne très bien mais j'ai remarqué qu'il ne prenait pas en compte si un élément à changé de calque ou de couleur, y a t'il une possibilité.

 

Encore bravo pour ce lisp car il nous fait gagner beaucoup de temps.

 

Salutations

Lien vers le commentaire
Partager sur d’autres sites

Bonjour à tous,

 

J'ai remarqué une anomalie.

Le code permet de voir si des entités ont changé de calques mais pas de couleur

 

J'ai modifié volontairement la couleur d'une polyligne mais toujours dans le même calque et le lisp ne l'a pas vu. Mais c'est à mon sens qu'un petit cas.

 

John.

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Ca me reviens maintenant, je n'acvais pas intégré les changements de calque ni de couleur (et d'autres propriétés) étant donné que le but initial était de voir les réelles modifications (aménagement des locaux, modifications structurelles,....) et non pas purement graphiques.

Quand aux attributs, je les utilise très peu, je vais regarder mais je ne te promets rien.

 

Si tu tiens à tester aussi la couleur, tu peux rajouter COLOR à la liste suivante que tu retrouveras dans lisp (merci à (gile) pour cette partie du code) :

 

'(ObjectName     Center	      Radius	     Coordinates

StartPoint     EndPoint	      StartAngle     EndAngle

MajorAxis      RadiusRatio    TextString     InsertionPoint

Width	       Height	      Rotation	     XScaleFactor

YScaleFacor    ZScaleFactor     Layer

      ) 

.

 

Lien vers le commentaire
Partager sur d’autres sites

  • 2 ans après...

Bonjour,

 

Je tenais à remercier vinz34 pour son Lisp et (gile) pour son complément qui permet de comparer 2 dwg, il me sert régulièrement...

 

mais je bute sur la comparaison de 2 fichiers: j'ai la même erreur que lili2006 (erreur: type d'argument incorrect:VLA-OBJECT nil)...

 

vinz34 a répondu

Le "vla-object nil" signifie la même chose que le "lentytip nil" avec autolisp.

Ca signifie que l'objet traité n'a pas de définition ou tout simplement qu'il n'y en a pas.

 

Mais je ne vois ce que signifie l'absence de définition?

 

Est ce quelqu'un pourrait me renseigner?

 

Merci d'avance.

Lien vers le commentaire
Partager sur d’autres sites

  • 1 an après...

Bonjour,

je voulais moi aussi t'adresser mes félicitations et mes remerciements pour cet excellent lisp :wub:

 

Puisque tu souhaitais des remarques en voici une petite :

la fenêtre qui s'ouvre pour choisir le dwg a comparer est un peu petite, y-t-il moyen de l'agrandir un peu ?

 

Merci encore

 

Ciao.

 

Merci a mikl63 de me l'avoir fait découvrir ;)

 

Salvatore

" Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "

Lien vers le commentaire
Partager sur d’autres sites

Juste une question toute bête : la dernière version du lisp se trouve en 1ère page ? c'est celle que j'ai récupéré en tout cas

Michaël, je crois que la dernière version se trouve à la réponse 25 :unsure:

 

Ciao.

 

Salvatore

" Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "

Lien vers le commentaire
Partager sur d’autres sites

J'ai rajouté un contrôle du nombre d'entités dans le bloc et corrigé les bugs rencontrés au fil des tests.

 

Voici la dernière version :

 

;;;modifié le 10.06.2009 : ajout de la vérification des calques d'entités

Si vous rencontrez des messages d'erreurs, merci de les signaler.

 

Tout commentaire reste le bienvenu.

Bonjour,

j'ai un souci : j'ai testé d'abord la version originale qui se trouve à la 1ere page et ça marche bien.

Puis j'ai testé la version qui se trouve à la réponse 25 et là AutoCAD sa plante !:angry:

 

Je travaille avec AutoCAD 2013, est-ce que ce lisp fonctionne avec la version 2013 ?

 

Merci d'avance vinz34 pour ton aide (et aux autres aussi si quelqu’un connait la réponse...).

 

Salvatore

" Celui qui a déplacé la montagne, c'est celui qui a commencé par enlever les petites pierres "

Lien vers le commentaire
Partager sur d’autres sites

  • 3 mois après...

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é