• Ce forum est la traduction générée par la machine de www.cad3d.it/forum1 - la communauté italienne du design. Plusieurs termes ne sont pas traduits correctement.

Rechercher des blocs dans un dessin

  • Auteur du sujet Auteur du sujet thetmd
  • Date de début Date de début

thetmd

Guest
bonjour tout le monde, j'ai besoin de conseils. je veux créer une macro qui remplace toutes les instances d'un bloc dans un design. je ne comprends pas si, en vba, j'ai un moyen de chercher directement les références de blocs dans un design avec quelque chose comme

bloc dim comme référence acadblock
pour chaque bloc <boh?!? cercare??="" cosa="" devo="" entro="" lo="">....

ou si la seule façon de rechercher est de définir une variable de type bloc et de rechercher dans tous les blocs de dessin si je trouve celui avec le nom qui m'intéresse

bloc dim comme bloc d'acad
pour chaque bloc dans ce dessin. blocs
si bloc. nom, etc.
(ok, je ne me souviens pas si la propriété est son nom ou autre :p mais pour le moment elle est influente)

pouvez-vous me faire des suggestions ? :confus:
je vous remercie.
pierpalo</boh?!?>
 
bonjour tout le monde, j'ai besoin de conseils. je veux créer une macro qui remplace toutes les instances d'un bloc dans un design. je ne comprends pas si, en vba, j'ai un moyen de chercher directement les références de blocs dans un design avec quelque chose comme
je vous remercie.
pierpalo
dim filtertype(0) comme entier
dim filterdata(0) comme variante

suite de l'erreur
' supprimer le jeu de sélection s'il existe
si ce n'est pas isnull(thisdrawing.selectionsets.item("element"))
définir sset = thisdrawing.selectionsets.item("element")
sset.delete
fin si

ltscale = cedrawing.getvariable("ltscale")

set sset = thisdrawing.selectionsets.add("element")


type de filtre(0) = 0
filterdata(0) = "insérer"

sset.sectonscreen filtre type, données filtrantes


s eltre alle entità blocco vuoi anse filtrare la selezione con un nome blocco

dim filtertype(1) comme entier
dim filterdata(1) comme variante

type de filtre(0) = 0
filterdata(0) = "insérer"
type de filtre(1) = 2
filterdata(1) = "nome blocco"


questo metodo usingza i codici dxf delel entita

es per vedere i codici

comando: [encart(car(entsel)))

Sélezionare oggetto: ((-1 . <nome 7de10290="" entità:="">) (</nome>0 . "insérer") (330).
<nome 7e0e8cd0="" entità:="">(100 . "acdbentity") (67 . 0) (410 .
"modèle" (8 . "g") (100 . "accdblockréférence") (</nome>2 . "nom") (10 152 768
6 8475e-0113 1,56769e-013) (41 1,0) (42 1,0) (43 1,0) (50 3,14159) (70
0) (71 0) (44 00) (450) (210 -2 13399e -016,63034 -0,776319)
 
Dernière édition:
au revoir. désolé d'avoir été trop prolifique dans ma question. j'essaie de m'expliquer.
j'ai un ensemble de dessins avec quelques symboles répétés plusieurs fois. je dois remplacer tous les symboles de tous les dessins par d'autres, en utilisant le même point d'insertion et la même rotation (le nouveau symbole est identique à l'ancien, mais a un attribut que l'autre n'a pas). j'ai créé le nouveau symbole dans une conception séparée et l'ai inséré dans la conception pour changer, en utilisant les caractéristiques de rotation et d'insertion du symbole précédent. en outre, j'ai une partie de la procédure dédiée à récupérer une valeur d'un attribut d'un autre bloc et l'associer au symbole que j'ai inséré nouveau.
le problème que je trouve maintenant est dû à l'annulation des symboles (à la fois ce que j'ai remplacé et celui dont j'ai repris la valeur de l'attribut). si j'insère des lignes pour l'annulation de symboles dans la routine pour...chaque...suivant j'obtiens à un moment donné une "erreur d'automation" (ce qui, je crois, est dû au fait que je porte une entité à laquelle ma variable pointe). je ne pouvais pas comprendre comment résoudre le problème de façon décente, donc j'ai dû choisir de supprimer les symboles avec un autre cycle pour..each..next (pour un type de symbole, que je peux supprimer sans problèmes) tandis que le second symbole (celui dont je récupère la valeur d'attribut) je ne peux pas supprimer toutes les instances et pour le moment j'ai résolu en sélectionnant les symboles de l'utilisateur et en les effaçant.

pouvez-vous m'aider à améliorer le code, s'il vous plaît, si vous pouvez supprimer les symboles lors de leur utilisation?

merci encore.
pierpalo


j'ai enlevé le code que j'ai produit :
(certaines lignes sont délibérément en mode commentaire)


'sur erreur aller très bien
'sur erreur reprendre suivant
dit en tant qu'entité recherchée par l'acadentité
dim entn acadblockreference 'nouvelle entité
dim entn_att comme nouvel attribut de bloc de variante
dim entv en tant qu'ancienne entité acadblockreference
dim p insert(2) comme double 'unto insertion of the new blind
dim rotation comme double' angle de rotation aveugle
dim nom de fichier comme chaîne 'nom de la nouvelle aveugle
dim ellisse en tant qu'entité d'acadentité
dim ellisse_att en tant qu'attribut variante'ellisse
dim ppoint comme point de la variante prise
dim valeur comme nom aveugle de chaîne
dim pickbox comme entier 'memoruzzo la valeur de la variable autocad pickbox
dim sset comme acadselectionset

cache-moi.

pickbox = thisdrawing.getvariable("pickbox")
je vais commencer la procédure.
' je suppose que tous les dessins ont été ouverts

nom de fichier = "c:\_work\clindness\simbcieca.dwg"
nom de fichier = "g:\_cieche\simbcieca.dwg"
**** j'insère de nouveaux symboles et réutilise la valeur aveugle
pour chaque ent dans cet espace modèle
if ent.objectname = "acdbblockreference" alors 'vérifier si c'est un bloc.
si ent.name = "cieca" alors 'je ne peux pas faire le contrôle avec et pourquoi tous les éléments n'ont pas une propriété 'name'
set entv = ent

'a imposé le point d'insertion du nouveau bloc et l'angle de rotation
p insertion(0) = entv.insertionpoint(0)
p insertion(1) = entv.insertionpoint(1)
p insertion(2) = entv.insertionpoint(2)
rotation = entv.rotation

j'insère le nouveau symbole
set entn = thisdrawing.modelspace. insertblock(p insert, nom de fichier, 1, rotation)

'zoom sur le nouveau symbole, pour récupérer le nombre aveugle
l'angle de rotation est le même que le bloc d'ellipse
' je déplace le nouvel attribut dans la même position que l'ancien
zoomcenter p insertion, 35
entn_att = entn.getattributes
ce dessin. setvariable "pickbox", 40
cedrawing.utility.getentity ellipse, ppoint
ce dessin. setvariable "pickbox", pickbox
ellisse_att = ellisse.getattributes
entn_att(0).textstring = ellisse_att(0).textstring
entn_att(0).rotation = ellisse.rotation
entn_att(0).move entn_att(0).textalignmentpoint, ellisse_att(0).textalignmentpoint

'regenero il progetto
ce dessin. les ports de regen acallview

fin si
fin si
suivant

c'est quoi ?
si je les supprime d'abord en situation d'erreur
pour chaque ent dans cet espace modèle
si ent.objectname = "acdbblockreference" alors
si ent.name = "cieca" alors 'ou ent.name = "cieca_testo" alors
'set entv = ent
ent.delete
fin si
fin si
suivant

**** [bonnez sur tous les dessins ****
zooments


set sset = thisdrawing.selectionsets.add("selection")
sset.sectonscreen
pour chaque entrée dans sset
if ent.objectname = "acdbblockreference" alors 'vérifier si c'est un bloc.
if ent.name = "cieca_testo" alors 'je ne peux pas contrôler avec et pourquoi tous les éléments n'ont pas une propriété 'name'
ent.delete
fin si
fin si
suivant


ce dessin.
ce dessin. fermer
boucle

fin:
 
je ferais quelque chose comme ça.

si vous passez votre dvb et un fichier exemple, je peux voir mieux que ce que c'est... sinon... avec les infos que j'ai... plus pour ne pas savoir comment et où agir.

'sur erreur aller très bien
'sur erreur reprendre suivant
dim ent comme entité recherchée par acadblockreference
dim entn acadblockreference 'nouvelle entité
dim entn_att comme nouvel attribut de bloc de variante
dim entv en tant qu'ancienne entité acadblockreference
dim p insertion(0 à 2) comme double 'non à insertion de la nouvelle aveugle
dim rotation comme double' angle de rotation aveugle
dim nom de fichier comme chaîne 'nom de la nouvelle aveugle
dim ellisse en tant qu'entité d'acadentité
dim ellisse_att en tant qu'attribut variante'ellisse
dim ppoint comme point de la variante prise
dim valeur comme nom aveugle de chaîne
dim pickbox comme entier 'memoruzzo la valeur de la variable autocad pickbox
dim sset comme acadselectionset

cache-moi.

pickbox = thisdrawing.getvariable("pickbox")

nom de fichier = "g:\_cieche\simbcieca.dwg"



suite de l'erreur
' supprimer le jeu de sélection s'il existe
si ce n'est pas isnull(thesdrawing.selectionsets.item("ent") alors
set sset = thisdrawing.selectionsets.item("ent")
sset.delete
fin si


set sset = thisdrawing.selectionsets.add("ent")



dim filtertype(1) comme entier
dim filterdata(1) comme variante

type de filtre(0) = 0
filterdata(0) = "insérer"
type de filtre(1) = 2
filterdata(1) = "cieca"


sset.sectonscreen filtre type, données filtrantes

pour chaque entrée dans sset

'a imposé le point d'insertion du nouveau bloc et l'angle de rotation
p insertion(0) = ent.insertionpoint(0)
p insertion(1) = point d'entrée(1)
p insertion(2) = ent.insertionpoint(2)
rotation = ent.rotation

ent.delete

j'insère le nouveau symbole
set entn = thisdrawing.modelspace. insertblock(p insert, nom de fichier, 1, rotation)

zoomcenter p insertion, 35
entn_att = entn.getattributes
ce dessin. setvariable "pickbox", 40
cedrawing.utility.getentity ellipse, ppoint
ce dessin. setvariable "pickbox", pickbox
ellisse_att = ellisse.getattributes
entn_att(0).textstring = ellisse_att(0).textstring
entn_att(0).rotation = ellisse.rotation
entn_att(0).move entn_att(0).textalignmentpoint, ellisse_att(0).textalignmentpoint

'regenero il progetto
ce dessin. les ports de regen acallview

suivant
 
merci pour la réponse, mais il y a un moyen d'éviter la sélection des objets, et de laisser la macro contrôler directement tous les symboles à remplacer... en réalité j'ai déjà fait, en ce sens que dans le week-end j'ai modifié tous les dessins que j'avais besoin, cmq je voudrais obtenir une macro qui a seulement besoin de l'activation de « clic » et le reste qu'elle pense. je vais essayer de remplacer le code macro et voir s'il se comporte mieux dans la suppression des entités. ;)

merci pour la réponse
pierpalo
 
merci pour la réponse, mais il y a un moyen d'éviter la sélection des objets, et de laisser la macro contrôler directement tous les symboles à remplacer... en réalité j'ai déjà fait, en ce sens que dans le week-end j'ai modifié tous les dessins que j'avais besoin, cmq je voudrais obtenir une macro qui a seulement besoin de l'activation de « clic » et le reste qu'elle pense. je vais essayer de remplacer le code macro et voir s'il se comporte mieux dans la suppression des entités. ;)

merci pour la réponse
pierpalo
au lieu d'utiliser sset.selectonscreen filtertype, filterdata

utiliser sset. sélectionner acselectionsetall, , type de filtre, données filtrantes

et sa sélection convient aux entités de dessin avec filtre actif
 

Statistiques du forum

Sujets
58 521
Messages
499 056
Membres
104 110
Dernier membre
ChristianR

Membres en ligne

Aucun membre en ligne actuellement.
Retour
Haut