Aller au contenu

Désactiver les accrobj sur les calques verrouillés


(gile)

Messages recommandés

Salut,

 

Mon cadeau pour la nouvelle année.

 

C'est encore un ébauche, ça provoque un scintillement du curseur (presque plus !), mais ça semble marcher.

 

La commande LOKO fonctionne comme une bascule qui active ou désactive les accrochages aux objets sur les calques verrouillés.

 

LockOsnap.dll à charger avec NETLOAD

 

Nouvelle version :

- LockOsnap_19.dll pour 2013

- Ajout d'une commande XROS pour activer/désactiver l'accrochage sur les xrefs.

 

Le code (C#)

 

using System;
using System.Collections.Generic;
using System.Linq;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Geometry;
using Autodesk.AutoCAD.Runtime;

namespace OsnapControl
{
   public class LockOsnap
   {
       private LockOsnapOverrule _osnapOverrule;
       private static ObjectId[] _onLocked;

       [CommandMethod("LOKO")]
       public void LockOsnapCmd()
       {
           Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
           if (_osnapOverrule == null)
           {
               ed.PromptingForPoint += OnPromptingForPoint;
               _osnapOverrule = new LockOsnapOverrule();
               Overrule.AddOverrule(RXClass.GetClass(typeof(Entity)), _osnapOverrule, false);
               ed.WriteMessage("\nAccrochages sur les calques verrouillés désactivé.");
           }
           else
           {
               ed.PromptingForPoint -= OnPromptingForPoint;
               Overrule.RemoveOverrule(RXClass.GetClass(typeof(Entity)), _osnapOverrule);
               _osnapOverrule = null;
               ed.WriteMessage("\nAccrochages sur les calques verrouillés activé.");
           }
       }

       private void OnPromptingForPoint(object sender, PromptPointOptionsEventArgs e)
       {
           _onLocked = GetOnLocked();
           _osnapOverrule.SetIdFilter(_onLocked);
           Overrule.Overruling = true;
       }

       private ObjectId[] GetOnLocked()
       {
           Database db = HostApplicationServices.WorkingDatabase;
           Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
           using (Transaction tr = db.TransactionManager.StartTransaction())
           {
               IEnumerable<string> layers = GetLocked(db);
               return ((BlockTableRecord)tr.GetObject(db.CurrentSpaceId, OpenMode.ForRead))
                   .Cast<ObjectId>()
                   .Where(id => layers.Contains(((Entity)tr.GetObject(id, OpenMode.ForRead)).Layer))
                   .ToArray();
           }
       }

       private IEnumerable<string> GetLocked(Database db)
       {
           return ((LayerTable)db.LayerTableId.GetObject(OpenMode.ForRead))
               .Cast<ObjectId>()
               .Select(id => (LayerTableRecord)id.GetObject(OpenMode.ForRead))
               .Where(ltr => ltr.IsLocked)
               .Select(ltr => ltr.Name);
       }

       public class LockOsnapOverrule : OsnapOverrule
       {
           public override bool IsContentSnappable(Entity entity)
           {
               return !_onLocked.Contains(entity.ObjectId);
           }

           public override void GetObjectSnapPoints(
               Entity entity,
               ObjectSnapModes snapMode,
               IntPtr gsSelectionMark,
               Point3d pickPoint,
               Point3d lastPoint,
               Matrix3d viewTransform,
               Point3dCollection snapPoints,
               IntegerCollection geometryIds)
           {
               Point3dCollection pts = new Point3dCollection();
               entity.UpgradeOpen();
               base.GetObjectSnapPoints(
                   entity, snapMode, gsSelectionMark, pickPoint, lastPoint, viewTransform, pts, geometryIds);
           }
       }
   }
}

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

hello Gile

 

bonne année

 

je viens de tester ton *.dll bien pratique :)

 

merci

 

voir les couches et etre sur de ne pas s'y accrocher, oui c'est le but

 

petite remarque si je peux me permettre

 

il ne prend pas les extremités, ni les milieux, mais il prend les intersections par contre

apres a nous peut etre de faire gaffe aussi et de les eviter

 

a+

 

bonne journé

 

phil

Autodesk Architecture 2023 sous windows 11 64

24 pouces vertical + 30 pouces horizontal + 27 pouces horizontal

Lien vers le commentaire
Partager sur d’autres sites

Meci (gile) d'avoir pondu ce lisp que j'avais suggéré en fin d'année :) :) :)

Ca a été plus rapide que je ne pouvais l'espérer, super cool !

 

Je vais le tester de suite.

 

Je te remercie infiniment et te souhaite plein de réussite pour l'année à venir, ainsi que les suivantes cela va de soi. ;)

Seuls nous allons vite, ensemble nous allons plus loin...

CPU Intel 3,5Go / Nvidia RTX-3090

AutoCad (Architecture) 2022 - Lumion PRO

BMW R-1200-RT, c'est moche, oui... je sais...

 

www.neda.ch

Lien vers le commentaire
Partager sur d’autres sites

Re,

Chez moi ça fonctionne, mais pas avec les accrochages de type intersection...? Il y a effectivement un scintillement, mais ça va. :)

Seuls nous allons vite, ensemble nous allons plus loin...

CPU Intel 3,5Go / Nvidia RTX-3090

AutoCad (Architecture) 2022 - Lumion PRO

BMW R-1200-RT, c'est moche, oui... je sais...

 

www.neda.ch

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Je sais, ça n'est pas la panacée : la méthode GetObjectSnapPoints ne prend pas en compte l'accrochage 'interection' et le scintillement est probablement dû au filtre qui doit ouvrir le ou les objets survolé(s) pour en vérifier l'état du calque à chaque movement de la souris.

En même temps ce ne sont que quelques lignes de code...

 

Je n'ai pas trop le temps de perfectionner ça en ce moment.

À ultiliser avec prudence, donc, si ça provoque des erreurs fatales (personnellement je n'en ai pas eu).

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Ben la voilà l'erreur fatale... :(rires forts):

 

Je ne vais plus trop m'en servir pour l'instant alors. ;)

Seuls nous allons vite, ensemble nous allons plus loin...

CPU Intel 3,5Go / Nvidia RTX-3090

AutoCad (Architecture) 2022 - Lumion PRO

BMW R-1200-RT, c'est moche, oui... je sais...

 

www.neda.ch

Lien vers le commentaire
Partager sur d’autres sites

J'ai un peu revu ma copie.

Il n'y a plus de scintillement excepté avec 'GetCorner' (deuxième point pour la commande RECTANG).

Je pense avoir corrigé ce qui provoquait des erreurs fatales (mais on n'est jamais sur...).

Je ne trouve toujours pas pour l'accrochage intersection.

 

S'il y a toujours des pilotes d'essai... à vos souris.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Impressionnant.

Bon, j'ai testé tout de suite 'LOKO pour voir si tout cela était aussi transparent ;)

Effectivement, l'accrochage Intersection continue impunément je dirais même frénétiquement tellement l'outil qui cherche les accrobjs n'a plus rien à se mettre sous la dent :P

 

En tous cas, c'est une bonne dll. Marche bien.

Difficile en transparence ? Juste curieux.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Merci d'avoir essayé

 

Difficile en transparence ? Juste curieux.

Plus qu'avant.

Explication sommaire :

La version précédente (qui fonctionnait en transparence) utilisait un "filtre en temps réel" : elle évaluait l'état du calque des objets au moment où le curseur les survolait, c'est ce qui provoquait le scintillement du curseur.

 

Pour palier à ça, la nouvelle version utilise un filtre par liste d'identifiant (ObjectId) pré-établie, il faut donc collecter tous les objets sur des calques verrouillés avant que ne commence la saisie du point. J'utilise un gestionnaire (réacteur) de l'évènement PromptingForPoint, qui est déclenché au moment où l'utilisateur est invité à saisir un point, pour mettre à jour la liste des objets sur des calques verrouillés. L'activation/désactivation de ce gestionnaire se faisant dans la commande LOKO son lancement en transparence arriverait donc trop tard.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Hello et merci pour la nouvelle version.

 

Je viens de tester un petit bout. L'affichage est nettement meilleur effectivement, l'accrochage intersection est toujours actif, mais bon on s'en accomode (je le désactive manuellement). Je n'ai pas eu d'erreur fatale, mais là il faut un peu plus d'essais... B)

Un truc surprenant, tout style d'accrochage reste actif sur des cotes ?!? Chez vous aussi ?

 

Bonne journée. :)

Seuls nous allons vite, ensemble nous allons plus loin...

CPU Intel 3,5Go / Nvidia RTX-3090

AutoCad (Architecture) 2022 - Lumion PRO

BMW R-1200-RT, c'est moche, oui... je sais...

 

www.neda.ch

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é