1. Ce site utilise des cookies. En continuant à utiliser ce site, vous acceptez l'utilisation des cookies. En savoir plus.

[VB Script] preparation de dessins

Discussion dans 'CamBam' créé par ben_mtl, 7 Décembre 2013.

  1. ben_mtl

    ben_mtl Nouveau

    Messages:
    18
    Inscrit:
    26 Octobre 2013
    [VB Script] preparation de dessins
    Bonjour,

    Je me suis finalement lancé pour tenter d'ecrire un petit script afin d'automatiser la prepration de mes dessins quand j'importe un dxf dans CamBam...
    Ca fait bien longtemps que j'ai pas fait de programmation et surtout je ne trouve pas de liste des fonctions de cambam alors si des âmes charitables peuvent m'aider un peu ca serait top !

    En gros, la facon dont je procede :
    - j'ouvre un dxf (manuellement)
    - je positionne mon DXF au bon endroit dans le repere CamBam (manuellement) mais je regarde comment faire pour que mes elements de dessin se créent directement a la bonne place dans mon logiciel de CAD (Catia)... autre projet :p

    ensuite c'est le script qui prendrait la relève :
    - créer un calque "zone1"
    - le rendre actif
    - créer un rectangle avec des dimension et une position prédéfinie
    - Selectionner la geometrie DANS ce rectangle
    - la deplacer dans le calque Zone1
    - Deplacer toute la geometrie du calque Zone1 d'un point A à un point B (ou selon un vecteur selon ce que je peux programmer)...

    J'ai regardé plein d'exemples de scripts, j'ai commencer a bricoller un peu de code et je bloque deja :p (et j'en suis meme pas aux choses dont je n'ai aucune idée de la syntaxe !!!)

    Voila ce que donne mon code pour le moment :
    Code:
    '
    '	dxf_prep.vbs
    '
    '	before running this script :	
    '		. open a CAD file (.dxf)
    '		. Move the geometry so it is located at the origin
    '	the script does :
    '		. create a layer and set it active
    '		. create a "boundary" polyrectangle
    '	    . selects the geometry inside this polyrectangle
    '		. cut
    '		. paste (thus moving the geometry to the active layer)
    '		. select all geometry in active layer
    '		. move all that geometry from point A to point B
    '
    
    sub main
    
    	dim newdoc = view.CADFile
    	
    	dim Zone1Layer as Layer
    	dim Zone1LayerName as string = "ZONE1"
    	Zone1Layer = CreateLayer(Zone1LayerName) 'create a layer named ZONE1
    	SetActiveLayer(Zone1LayerName)	'set this layer as active
    	Activelayer.color = color.Blue	    'change color
    
    	'
    	' create Zone1 boundary
    	'
    
    	dim RectZone1 = new Polyrectangle()
    	RectZone1.Width = 72
    	RectZone1.Height = 12
    	RectZone1.LowerLeft = new Point3F(-6,12,0)
    	newdoc.Add(RectZone1)
    	
    	dim circle = new Circle()
    	circle.Center = new Point3F(-30,15,0)
    	circle.Diameter=15
    	newdoc.Add(circle)
    
    end sub
    
    Ce qui fonctionne :
    -la creation du calque et les operations sur celui-ci
    -la creation du retangle et d'un cercle (pour un essai)
    -l'affichage du cercle

    Ce qui ne fonctionne pas :
    -le rectangle existe dans le calque mais ne s'affiche pas sur le dessin... le cercle oui.

    Alors ma première question serait de savoir pourquoi le rectangle ne s'affiche pas, ce n'est pas indispensable pour moi car il va juste me servir de "zone de selection" mais c'est surprennant...

    Pour la suite des operations, je sais comment selectionner toute la geometrie d'un dessin, je sais aussi comment selectionner seulement la geometrie d'un calque... mais pour selectionner la geometrie a l'interieur d'une forme limite.. ca je ne sais pas :( quelqu'un a une idée ?

    Dés que j'ai mon accès pour le forum Cambam UK je poserai la question là-bas aussi mais je compte partager mes progrés sur les 2 forums en parallèle..

    Merci !

    Benoit
     
  2. dh42

    dh42 Compagnon

    Messages:
    3 975
    Inscrit:
    4 Septembre 2009
    Localité:
    Près de St Etienne (42)
    [VB Script] preparation de dessins
    Salut,

    Pour ton polyrectangle qui ne s'affiche pas, pour une raison inconnue (de moi), il semble qu'il faille "appliquer les transformations" ... en tout cas ça marche chez moi.

    Pour faire ça, ajoute la ligne

    RectZone1.ApplyTransformation()

    Juste après: newdoc.Add(RectZone1)


    Quelques lien utiles:

    http://www.cambam.info/doc/api/
    http://www.cambam.co.uk/forum/index.php?topic=3246.0

    et biens sur des tas de script à étudier ... il n'y a malheureusement pas de doc des fonctions de CB pour l'instant en dehors de la mini doc du premier lien.

    pour ma part j'utilise Reflector et Autodiagrammer pour explorer les DLL et deviner comment ça marche.

    Il y a aussi le script Mop-automate dans le dossier de script, et le plugin (en C) HeightMapPlugin-Src.zip ... et bien sur le forum anglais ..

    http://www.vss-tech.com/autodiagrammer/
    http://telecharger.tomsguide.fr/Reflector-NET,0301-21024.html

    ++
    David
     
    Dernière édition par un modérateur: 16 Avril 2015
  3. dh42

    dh42 Compagnon

    Messages:
    3 975
    Inscrit:
    4 Septembre 2009
    Localité:
    Près de St Etienne (42)
    [VB Script] preparation de dessins
    Re

    Les infos sont dans le code ; le fichier CB de test est en PJ.
    Les résultats s'affichent dans la fenêtre de messages.


    Code:
    ' dh42 / 12/2013
    
    ' détecter si une polyligne est contenue dans une autre
    ' si intersection des 2 polylignes, la polyligne sera 
    ' considérée comme contenue ; il faudra donc aussi
    ' tester si il y a intesection.
    
    sub main
    	
    	
    	'créer une polyligne conteneur mais sans l'afficher, ce qui n'empèche pas d'utiliser
    	'la polyligne créée
    	
    	' ce code ne fonctionne qu'avec des polylignes, il faudra donc
    	' convertir tous les objets de dessin en polyligne au préalable.
    
    	dim conteneur = new Polyline()
    
    	conteneur.Add(-79,14,0)
    	conteneur.Add(-4,14,0)
    	conteneur.Add(-4,60,0)
    	conteneur.Add(-79,60,0)
    	conteneur.Closed=True
    
    
    	dim ent as Entity
    
    	'selectionne toutes les entitées du calque courant
    
    	SelectAllLayerGeometry(activelayer())
    
    	dim p = new Polyline()	' crée un pointeur de type Polyligne
    	
    	dim b1 as boolean	' contenu
    	dim b2 as boolean	' intersection
    	dim rep as string	' chaine de réponse
    
    	for each ent in view.SelectedEntities	'scanner la sélection
    		
    		p = ent	' conversion de type 'pointeur entity' -> 'pointeur Polyligne'
    		
    		'retourne vrai si p est incluse dans 'conteneur' ou si intersection.
    
    		b1 = conteneur.PolylineInsidePolyline(p)
    
    		'retourne vrai si intersection entre les 2.
    
    		b2 = conteneur.Intersects(p)
    
    		rep = "PolyLigne: " & p.ID & " Contenue: " & b1 & " - Intersection: " & b2
    
    		app.log(rep)	'sortie dans fenetre de messages
    
    	next ent
    
    	'affiche le conteneur (donc il n'a pas été sélectionné lors de la sélection
    	' du contenu du calque; il pourrait aussi être sur un calque différent pour faire
    	' plus simple)
    
    	doc.Add(conteneur)
    
    end sub
    
    
    ++
    David Voir la pièce jointe test_contenu.rar
     
  4. ben_mtl

    ben_mtl Nouveau

    Messages:
    18
    Inscrit:
    26 Octobre 2013
    [VB Script] preparation de dessins
    Ah j'ai bien avancé finalement aujourd'hui. Encore un gros merci pour ton aide David !
    En l'etat mon script est capable de joindre mes differentes geometries et de les copier dans differents calques en fonction de leur position sur le dessin (les calques sont créés par le script aussi).
    Il me reste donc à deplacer le contenu de chaque calque pour tout superposer à l'origine, et si je me sens fort peut etre que je vais automatiser la creation de certaines operations d'usinage tant qu'a y etre...

    Là c'est l'heure d'aller se coucher, je posterai le code demain.
     
  5. dh42

    dh42 Compagnon

    Messages:
    3 975
    Inscrit:
    4 Septembre 2009
    Localité:
    Près de St Etienne (42)
    [VB Script] preparation de dessins
    Salut,

    Ah ! passer des nuits à programmer, ça me rappelle mes débuts en programmation :-D

    Pour déplacer des objets, je ne pense pas que l'on puisse déplacer toute une sélection en une seule fois ; il doit falloir s'y prendre objet par objet.

    un script pour déplacer les objets sélectionnés (avec saisie de la valeur)

    Code:
    ' Move_XY.vbs CamBam
    sub main
    
    	dim move_x as double
    	dim move_y as double
    
    	move_x = val(inputbox("Move X","0"))
    	move_y = val(inputbox("Move Y","0"))
    	
    	if view.SelectedEntities.Length > 0 then
    
    
    			for each ent as Entity in view.SelectedEntities
    				ent.Transform.Translate(move_x,move_y,0)
    
    				' appliquer les transformations
    
    				if ent.ApplyTransformation() then
    				    ent.Transform = Matrix4x4F.Identity
    				end if
    
    			next ent
    
    			view.RefreshView()
    
    	end if
    
    end sub
    
    ++
    David
     
  6. ben_mtl

    ben_mtl Nouveau

    Messages:
    18
    Inscrit:
    26 Octobre 2013
    [VB Script] preparation de dessins
    Haha non pas la nuit complete mais j'y ai passé la soirée :p (decallage horaire)

    Merci pour le code pour faire des translations, je met un peu plus bas le code tel qu'il etait hier soir, tu verra que j'avais commencé a explorer (sans succés) comment utiliser une matrice de transformation 4x4 sur un element a la fois en meme temps que je le change de calque mais j'etais assez loin de quelque chose qui fonctionne :p

    Je met en piece jointe mon fichier test pour valider que ca fonctionne, si tu essaie le script tu verra les operations qui sont faites (transfo en polylines, jonction de lignes, changement de calque en fonction de la position..) et aussi un petit "bug" non problematique pour l'instant : mes geometries sont copiées dans leur calque respectif mais restent aussi dans le calque par defaut (avec le meme ID), ca ne change rien et une fois le script terminé il suffira de supprimer ce calque original...

    Je vais ajouter la fonction de translation, tester ca puis je vais m'attaquer a "nettoyer" le code, je declare plein de variable qui sont plus ou moins utiles, en fait je peux surement condenser énormément mon code en utilisant des boucles mieux réfléchies... enfin bon pour l'instant ca fonctionne c'est deja top !

    Code:
    '
    '	dxf_prep.vbs
    '	ben_mtl 12/2013
    '
    '	before running this script :	
    '		. open a CAD file (.dxf)
    '		. Move the geometry so it is located at the origin
    '	the script does :
    '		. create a layer and set it active
    '		. create a "boundary" polyrectangle
    '	    . selects the geometry inside this polyrectangle
    '		. cut
    '		. paste (thus moving the geometry to the active layer)
    '		. select all geometry in active layer
    '		. move all that geometry from point A to point B
    '
    
    sub main
    
    
    	dim newdoc = view.CADFile
    	
    	'
    	' create boundaries
    	'
    
    	dim ZoneSkiFinal = new Polyline()
    	ZoneSkiFinal.Add(-100,19.686,0)
    	ZoneSkiFinal.Add(-100,27.559,0)
    	ZoneSkiFinal.Add(100,27.559,0)
    	ZoneSkiFinal.Add(100,19.686,0)
    	ZoneSkiFinal.Closed=True
    
    	dim ZoneSemelle = new Polyline()
    	ZoneSemelle.Add(-100,11.811,0)
    	ZoneSemelle.Add(-100,19.685,0)
    	ZoneSemelle.Add(100,19.685,0)
    	ZoneSemelle.Add(100,11.811,0)
    	ZoneSemelle.Closed=True
    
    	dim ZoneSidewallsBois = new Polyline()
    	ZoneSidewallsBois.Add(-100,-11.811,0)
    	ZoneSidewallsBois.Add(-100,-19.685,0)
    	ZoneSidewallsBois.Add(100,-19.685,0)
    	ZoneSidewallsBois.Add(100,-11.811,0)
    	ZoneSidewallsBois.Closed=True
    
    	dim ZoneGroove4 = new Polyline()
    	ZoneGroove4.Add(-100,-19.686,0)
    	ZoneGroove4.Add(-100,-27.559,0)
    	ZoneGroove4.Add(100,-27.559,0)
    	ZoneGroove4.Add(100,-19.686,0)
    	ZoneGroove4.Closed=True
    
    	dim ZoneGroove3 = new Polyline()
    	ZoneGroove3.Add(-100,-27.560,0)
    	ZoneGroove3.Add(-100,-35.433,0)
    	ZoneGroove3.Add(100,-35.433,0)
    	ZoneGroove3.Add(100,-27.560,0)
    	ZoneGroove3.Closed=True
    
    	dim ZoneGroove2 = new Polyline()
    	ZoneGroove2.Add(-100,-35.434,0)
    	ZoneGroove2.Add(-100,-43.307,0)
    	ZoneGroove2.Add(100,-43.307,0)
    	ZoneGroove2.Add(100,-35.434,0)
    	ZoneGroove2.Closed=True
    
    	dim ZoneGroove1 = new Polyline()
    	ZoneGroove1.Add(-100,-43.308,0)
    	ZoneGroove1.Add(-100,-51.181,0)
    	ZoneGroove1.Add(100,-51.181,0)
    	ZoneGroove1.Add(100,-43.308,0)
    	ZoneGroove1.Closed=True
    
    
    '
    '	CREATE LAYERS
    '
    
    	dim ZoneSkiFinalLayer as Layer
    	dim ZoneSkiFinalLayerName as string = "SKI FINAL"
    	ZoneSkiFinalLayer = CreateLayer(ZoneSkiFinalLayerName) 'create a layer named SKI FINAL
    	ZoneSkiFinalLayer.color = color.Red	    'change color
    	
    	dim ZoneSemelleLayer as Layer
    	dim ZoneSemelleLayerName as string = "SEMELLE"
    	ZoneSemelleLayer = CreateLayer(ZoneSemelleLayerName) 'create a layer named SEMELLE
    	ZoneSemelleLayer.color = color.Yellow	    'change color
    
    	dim ZoneSidewallsBoisLayer as Layer
    	dim ZoneSidewallsBoisLayerName as string = "SIDEWALLS BOIS"
    	ZoneSidewallsBoisLayer = CreateLayer(ZoneSidewallsBoisLayerName) 'create a layer named SIDEWALLS BOIS
    	ZoneSidewallsBoisLayer.color = color.Green	    'change color
    
    	dim ZoneGroove1Layer as Layer
    	dim ZoneGroove1LayerName as string = "Groove 1"
    	ZoneGroove1Layer = CreateLayer(ZoneGroove1LayerName) 'create a layer named Groove 1
    	ZoneGroove1Layer.color = color.Blue	    'change color
    
    	dim ZoneGroove2Layer as Layer
    	dim ZoneGroove2LayerName as string = "Groove 2"
    	ZoneGroove2Layer = CreateLayer(ZoneGroove2LayerName) 'create a layer named Groove 2
    	ZoneGroove2Layer.color = color.Blue	    'change color
    
    	dim ZoneGroove3Layer as Layer
    	dim ZoneGroove3LayerName as string = "Groove 3"
    	ZoneGroove3Layer = CreateLayer(ZoneGroove3LayerName) 'create a layer named Groove 3
    	ZoneGroove3Layer.color = color.Blue	    'change color
    
    	dim ZoneGroove4Layer as Layer
    	dim ZoneGroove4LayerName as string = "Groove 4"
    	ZoneGroove4Layer = CreateLayer(ZoneGroove4LayerName) 'create a layer named Groove 4
    	ZoneGroove4Layer.color = color.Blue	    'change color
    
    
    '
    'Joindre les polylignes
    '
    
    
    	SelectAllLayerGeometry(activelayer()) 							'selectionne toute la geometrie du calque courant
    	
    	PolylineUtils.PolyLinesConvert(CamBamUI.MainUI.ActiveView)  ' convertit toutes les entites en polylines
    	while not CamBamUI.MainUI.ActiveView.CurrentEditMode is nothing  	'attend que la conversion soit finie
    		app.Sleep(1)													'attend que la conversion soit finie
    	end while															'attend que la conversion soit finie
    
    	PolylineUtils.JoinPolyLines(CamBamUI.MainUI.ActiveView,0.001)		'edit -» join
    	while not CamBamUI.MainUI.ActiveView.CurrentEditMode is nothing		'attend que le JOINT soit fini
    		app.Sleep(1)
    	end while
    
    
    '
    '	TRAVAIL SUR LES GEOMETRIES
    '
    
    	dim ent as Entity
    	dim p = new Polyline()  	' crée un pointeur de type Polyligne
    	dim b11 as boolean   		' contenu
    	dim b12 as boolean   		' intersection
    	dim b21 as boolean   		' contenu
    	dim b22 as boolean   		' intersection
    	dim b31 as boolean   		' contenu
    	dim b32 as boolean   		' intersection
    	dim b41 as boolean   		' contenu
    	dim b42 as boolean   		' intersection
    	dim b51 as boolean   		' contenu
    	dim b52 as boolean   		' intersection
    	dim b61 as boolean   		' contenu
    	dim b62 as boolean   		' intersection
    	dim b71 as boolean   		' contenu
    	dim b72 as boolean   		' intersection
    
    	SelectAllLayerGeometry(activelayer()) 'selectionne toutes les entitées du calque courant
    
    	for each ent in view.SelectedEntities   'scanne la sélection
    		p = ent   ' conversion de type 'pointeur entity' -> 'pointeur Polyligne'
    		b11 = ZoneSkiFinal.PolylineInsidePolyline(p)		'retourne vrai si p est incluse dans 'conteneur' ou si intersection.
    		b12 = ZoneSkiFinal.Intersects(p)					'retourne vrai si intersection entre les 2
    		b21 = ZoneSemelle.PolylineInsidePolyline(p)		'retourne vrai si p est incluse dans 'conteneur' ou si intersection.
    		b22 = ZoneSemelle.Intersects(p)					'retourne vrai si intersection entre les 2
    		b31 = ZoneSidewallsBois.PolylineInsidePolyline(p)		'retourne vrai si p est incluse dans 'conteneur' ou si intersection.
    		b32 = ZoneSidewallsBois.Intersects(p)					'retourne vrai si intersection entre les 2
    		b41 = ZoneGroove4.PolylineInsidePolyline(p)		'retourne vrai si p est incluse dans 'conteneur' ou si intersection.
    		b42 = ZoneGroove4.Intersects(p)					'retourne vrai si intersection entre les 2
    		b51 = ZoneGroove3.PolylineInsidePolyline(p)		'retourne vrai si p est incluse dans 'conteneur' ou si intersection.
    		b52 = ZoneGroove3.Intersects(p)					'retourne vrai si intersection entre les 2
    		b61 = ZoneGroove2.PolylineInsidePolyline(p)		'retourne vrai si p est incluse dans 'conteneur' ou si intersection.
    		b62 = ZoneGroove2.Intersects(p)					'retourne vrai si intersection entre les 2
    		b71 = ZoneGroove1.PolylineInsidePolyline(p)		'retourne vrai si p est incluse dans 'conteneur' ou si intersection.
    		b72 = ZoneGroove1.Intersects(p)					'retourne vrai si intersection entre les 2
    
    		if b11=true OR b12=true							'si l'entité touche ou est a l'interieur de la zone ZoneSkiFinal
    			ZoneSkiFinalLayer.Entities.Add(ent)			'copie l'entité dans calque SKI FINAL
    
    '			dim MatSkiFinal as Matrix4x4F()
    '			MatSkiFinal=(1,0,0,0,0,1,0,0,0,0,1,0,0,-23.622,0,1)
    '			ent.ApplyTransformation(MatSkiFinal)		'edit -» move
    '			while not CamBamUI.MainUI.ActiveView.CurrentEditMode is nothing		'attend que le JOINT soit fini
    '				app.Sleep(1)
    '			end while
    
    		end if
    
    		if b21=true OR b22=true							'si l'entité touche ou est a l'interieur de la zone ZoneSemelle
    			ZoneSemelleLayer.Entities.Add(ent)			'copie l'entité dans calque SEMELLE
    		end if
    
    		if b31=true OR b32=true							'si l'entité touche ou est a l'interieur de la zone ZoneSidewallsBois
    			ZoneSidewallsBoisLayer.Entities.Add(ent)			'copie l'entité dans calque SIDEWALLS BOIS
    		end if
    
    		if b41=true OR b42=true							'si l'entité touche ou est a l'interieur de la zone ZoneGroove4
    			ZoneGroove4Layer.Entities.Add(ent)			'copie l'entité dans calque Groove 4
    		end if
    
    		if b51=true OR b52=true							'si l'entité touche ou est a l'interieur de la zone ZoneGroove3
    			ZoneGroove3Layer.Entities.Add(ent)			'copie l'entité dans calque Groove 3
    		end if
    
    		if b61=true OR b62=true							'si l'entité touche ou est a l'interieur de la zone ZoneGroove2
    			ZoneGroove2Layer.Entities.Add(ent)			'copie l'entité dans calque Groove 2
    		end if
    
    		if b71=true OR b72=true							'si l'entité touche ou est a l'interieur de la zone ZoneGroove1
    			ZoneGroove1Layer.Entities.Add(ent)			'copie l'entité dans calque Groove 1
    		end if
    
    	next ent
    
    
    end sub
    
    Voir la pièce jointe fichier test organisation DXF.zip
     
  7. jeramenemafraise

    jeramenemafraise Ouvrier

    Messages:
    254
    Inscrit:
    6 Janvier 2013
    [VB Script] preparation de dessins
    salut Ben_mtl,

    je vois que tu connais bien le language VBS, super.

    tu bosses en pouces ?.
    j'ai essayé ton sous programme, mais je ne vois pas trop encore son utilité,pour le moment.

    bonne fin de journée.
    Yves.
     
  8. ben_mtl

    ben_mtl Nouveau

    Messages:
    18
    Inscrit:
    26 Octobre 2013
    [VB Script] preparation de dessins
    Salut Yves,

    Non je ne connais pas vraiment le VBS mais j'apprend...
    En effet je bosse en pouces, pas par choix mais plutôt par nécessité : j'habite au Quebec (Français d'origine) et ici tout est en pouces : les matériaux, les outils, la majorité des instruments de mesure, du coup ma machine CNC est aussi calibrée en pouces et Mach3 aussi... alors pas le choix ! Malgré tout je dessine souvent mes projets en millimètres avec Catia et je convertis en pouce lors de l'exportation en DXF.

    Mon sous-programme est vraiment très spécifique à mon application : mon processus de CAD me sort les géométries que tu peux voir dans le fichier CamBam de test, en gros ça correspond aux différentes géométries que je dois découper en fonction de l'outil utilisé, et des paramètres d’opération.

    Dans Catia (mon logiciel de CAD) je me suis fait des modèles entièrement paramétrés pour mes skis : je rentre les dimensions recherchée et ca me sort un DXF avec les différentes formes a découper en fonction de l'outil, du matériau, de l’opération..
    Le problème vient du fait que Catia ne gère pas les calques, donc je ne peux pas exporter toutes mes géométries superposées les unes sur les autres dans différents calques. Pour palier à ça les géométries sont simplement décalées les unes par rapport aux autres, toujours de la même façon.

    Mon sous programme se charge "tout simplement" de me remettre toutes les géométries superposées, dans différents calques en fonction de l'outils / opération d'usinage.

    Par exemple :
    - le calque "SKI FINAL" correspond a la forme finale de mon ski, ça me sert de référence et je ne ferai pas d’opération d'usinage a partir de cette géométrie.
    - le calque "SEMELLE" correspond au parcours d'outil que doit suivre mon couteau tangentiel pour découper une feuille de plastique (semelle des skis)
    - le calque "Sidewalls Bois" est une relique d'un ancien processus, pour l'instant ça ne sert a rien mais je le garde comme référence
    - le calque Groove1 sert pour la découpe d'une poche dans une planche de bois, à une profondeur particulière
    - le calque Groove2 fait une poche a une autre profondeur.. ainsi de suite

    les différents calques "groove" sont ma solution a un problème de poche a profondeur variable, exposé dans un autre sujet il y a quelques semaines.
     
  9. dh42

    dh42 Compagnon

    Messages:
    3 975
    Inscrit:
    4 Septembre 2009
    Localité:
    Près de St Etienne (42)
    [VB Script] preparation de dessins
    Salut,

    Pas sur ; fait la manip suivante:

    - sélectionne tous le contenu du dessin , centre(étendu), puis applique le script.

    la polyligne 12 apparait 3 fois, une fois dans le calque 0, et dans les grooves 3 et 4 ... (et ça met une alerte dans la fenetre de message si tu est en niveau de diag 4)

    si je sauve le fichier, puis que je le ré ouvre, les polylignes en double ne disparaissent pas, elle sont renumérotées, comme tu peux voir sur cette image.
    ce qui peux être gênant si c'est sur des calques qui ne seront pas supprimés.

    bug.jpg

    Je pense que c'est du au fait que le 'pointeur' vers la polyligne n'a pas été enlevé de l'ancien calque. (de l' EntityCollection attaché au calque)

    il faudrait probablement un truc du genre:

    AncienLayer.Entities.Remove(ent)

    exécuté après avoir ajouté l'entité au nouveau calque.

    ou plus simple, si tu te fiche de garder les même n° d'ID pour les polylignes, tu crée une nouvelle polyligne et tu supprime l'ancienne via son pointeur.

    Si mon flair ne me trompe pas, je pense que la fonction que j'ai surlignée devrait permettre de créer une nouvelle Entity, à partir d'une autre (src) ; donc une copie.

    EntityCollection.jpg

    ++
    David
     
  10. dh42

    dh42 Compagnon

    Messages:
    3 975
    Inscrit:
    4 Septembre 2009
    Localité:
    Près de St Etienne (42)
    [VB Script] preparation de dessins
    Re

    Bon, pour déplacer d'un calque à un autre, c'est bien ça ; il faut supprimer l'entrée dans le calque source.

    un exemple ; pour le tester fait cette manip sous cambam.

    ' créer un calque et le nommer "1" (sans les guillemets) ce sera le calque de destination
    ' rendre un autre calque courant (c'est sur celui la que le script dessinera l'objet à déplacer)

    Code:
    ' avant de lancer le script:
    
    ' créer un calque et le nommer "1" (sans les guillemets) ce sera le calque de destination
    ' rendre un autre calque courant (c'est sur celui la que sera dessinée l'objet à déplacer)
    
    sub main
    
    	' dessine un cercle sur le calque courant
    
    	dim cercle1 as Circle = New Circle()
    	dim c as Point3F
    	dim ent as Entity
    
    	c.x=0
    	c.y=0
    	c.z=0
    
    	cercle1.center = c
    	cercle1.diameter = 50.0
    
    	doc.add(cercle1)
    
    	msgbox("attente")
    
    	dim dest_Layer as Layer
    	dim l_name as string = "1"
    
    	SetActiveLayer(l_name)	
    
    	dest_Layer = ActiveLayer()	'get the pointer to this layer
    
    	
    ' sous routine perso
    	MoveEntity( cercle1, dest_layer)
    
    	
    end sub
    
    '----------------------------------------------------------
    
    Sub MoveEntity( byref e as Entity, byref d as Layer)
    
    	'déplace l'objet "e" de type Entity de son calque d'origine vers
    	'le calque "d" passé en argument
    
        dim src_layer as Layer
    
    	'récup le pointeur vers le calque source de l'objet.
    	src_layer = e.Layer	
    
    	'si calque source = calque cible, sortir
    	if src_layer.name = d.name then	
    		exit sub
    	end if
    
    	'suprime l'entity de l'ancien calque "src_layer"
    	src_layer.Entities.remove(e)	
    
    	' et la met sur le nouveau.
    	d.Entities.Add(e)  
           
    End sub
    
    
    ++
    David
     
  11. jeramenemafraise

    jeramenemafraise Ouvrier

    Messages:
    254
    Inscrit:
    6 Janvier 2013
    [VB Script] preparation de dessins
    Bonjour à tous,
    Pour faire des sous programme pour Cambam, en VBS, le language c'est du javascript ?
    ou peut-on trouver un livre ,ou un site,pour se familiariser avec ce language ?
    il y a plusieurs type de javascript ?,si oui quel reference concernant CB ?...

    existe -il un éditeur de pour ce genre de language , surtout pour éviter les bugs ?.

    merci par avance pour vos réponses.

    Yves.
     
  12. dh42

    dh42 Compagnon

    Messages:
    3 975
    Inscrit:
    4 Septembre 2009
    Localité:
    Près de St Etienne (42)
    [VB Script] preparation de dessins
    Salut,

    Non, VBS c'est Visual Basic Script (un Visual Basic "allégé")

    Note qu'il est aussi possible d'utiliser le JavaScript ou le Python avec CB, mais je ne connais ni l'un ni l'autre.

    Pour le visual basic (et d'autres)

    http://msdn.microsoft.com/fr-fr/vstudio/hh388573

    Pour le Visual Basic, il est intégré ; pour le VB script, il y celui de cambam, ou plus évolué, quelque chose comme Programmers Notepad, par contre tu ne peux pas lancer l’exécution du script via PN, uniquement depuis l'éditeur de CB, ce qui oblige à ré-ouvrir le fichier.

    http://www.pnotepad.org/download/

    Ni l'un ni l'autre ne "corrige les bugs" :wink: ... avec la version complète de VB (pas pour les script), tu peux faire du pas à pas, lire les variables, l'éditeur à une aide à la saisie, etc ... mais pas avec le vbs (à moins d'utiliser l'éditeur de VB pour taper tes script VBS)

    VB est gratuit (la version complète), tu peux le télécharger et l'installer depuis le premier lien de ce message.

    ++
    David
     
    Dernière édition par un modérateur: 16 Avril 2015
  13. jeramenemafraise

    jeramenemafraise Ouvrier

    Messages:
    254
    Inscrit:
    6 Janvier 2013
Chargement...
Articles en relation
  1. braabu
    Réponses:
    4
    Affichages:
    112
  2. dh42
    Réponses:
    10
    Affichages:
    1 246
  3. dh42
    Réponses:
    3
    Affichages:
    1 121
  4. dh42
    Réponses:
    16
    Affichages:
    1 675
  5. cncnet
    Réponses:
    9
    Affichages:
    788

Partager cette page