Dernières actualités
Comment modifier les textes de cote et les lignes de repère dans Archicad 29 ?Comment réduire le nombre de polygones d’un modèle avec Decimate Modifier dans BlenderGuide pour gérer les configurations répétitives de pièces et d’étages avec les groupes RevitVirtual Shadow Maps dans Unreal Engine 5 : guide des ombres en archvizAMD dévoile l’EPYC Embedded 9006 : 256 cœurs et plateforme SP7Guide du débruitage dans Blender : réduire le bruit de Cycles dans le compositeurLe campus du musée municipal de Keşan récompensé en architecture aux Altın KarıncaGuide Rhino 8 CageEdit : déformer un modèle avec précision grâce à une cageComment suivre les événements d’un modèle avec les classes observer de l’API Ruby de SketchUp ?Créer des visuels conceptuels avec SketchUp Diffusion : guide pour les architectes
TutorielsSketchUp

Comment suivre les événements d’un modèle avec les classes observer de l’API Ruby de SketchUp ?

Dans l’API Ruby de SketchUp, EntitiesObserver, ModelObserver et DefinitionObserver permettent de suivre les événements liés à la géométrie, aux opérations sur le modèle et aux composants. Ce guide présente leur mise en place et les limites importantes des callbacks.

De fins faisceaux lumineux autour d’une maquette d’architecture symbolisent les événements du modèleImage IA
Image d’illustration générée par IA.Image : 3dsınıfı / FCA AI

En bref

  1. EntitiesObserver permet de suivre l’ajout, la modification et la suppression d’éléments dans une collection Entities.
  2. ModelObserver propose des callbacks pour les événements du modèle, comme l’enregistrement, l’insertion d’un composant et la fin d’une opération.
  3. Les notifications de commit et d’opération vide sont transmises au moment du commit ; un callback onTransactionAbort est prévu pour l’annulation d’une opération.
  4. DefinitionObserver peut suivre l’ajout ou la suppression d’instances d’une définition de composant.

Ce que vous allez apprendre dans ce guide

Dans l’API Ruby de SketchUp, les classes observer servent à réagir aux événements qui se produisent sur un objet ou une collection donnés. Ce guide aborde trois niveaux : EntitiesObserver pour les collections de géométrie, ModelObserver pour les événements liés au modèle et DefinitionObserver pour les instances d’une définition de composant. Vous verrez comment créer une classe observer et l’associer à l’objet à surveiller.

Cette méthode peut servir à consigner des événements dans des extensions ou à suivre les actions de l’utilisateur. Toutefois, les observers ne doivent pas être considérés comme un mécanisme capable de détecter immédiatement chaque événement et de modifier le modèle sans risque. Le moment où les callbacks d’opération sont exécutés, l’état des objets supprimés et les exceptions liées à certains outils influent notamment sur la conception de l’application.

Prérequis et choix du périmètre

Les exemples s’appuient sur les classes et méthodes de la documentation de l’API Ruby de SketchUp. Les sources indiquent SketchUp 6.0 pour EntitiesObserver et DefinitionObserver, SketchUp 8.0 pour onElementModified, et SketchUp 2014 pour le callback du plan de coupe actif. La documentation de ModelObserver explique quant à elle le fonctionnement des événements d’opération à partir de SketchUp 2016. Il s’agit des informations de version mentionnées dans les sources pour les fonctionnalités API concernées ; aucun prérequis particulier concernant la version de SketchUp, le type de compte, le tarif ou le matériel n’est indiqué pour ce guide.

Commencez par déterminer à quel niveau se produit l’événement à suivre :

  • Utilisez EntitiesObserver pour les événements liés aux éléments d’une collection Sketchup::Entities.

  • Privilégiez ModelObserver pour les événements au niveau du modèle, comme l’enregistrement, l’insertion d’un composant ou les opérations.

  • Utilisez DefinitionObserver pour suivre l’ajout ou la suppression d’instances associées à une définition de composant donnée.

La classe observer doit définir la méthode callback correspondant à l’événement à surveiller. Une instance de cette classe est ensuite ajoutée à la collection, au modèle ou à la définition de composant concerné. Les exemples ci-dessous affichent un message dans la console afin de permettre de voir quel callback est exécuté.

1. Suivre les modifications d’une collection de géométrie

EntitiesObserver surveille les événements qui se produisent dans une collection Sketchup::Entities. La classe ci-dessous signale séparément l’ajout, la modification et la suppression d’un élément. Elle définit également un callback distinct pour la suppression d’un ou de plusieurs éléments de la collection.

ruby
class EntityEvents < Sketchup::EntitiesObserver
  def onElementAdded(entities, entity)
    puts "Eklendi: #{entity}"
  end

  def onElementModified(entities, entity)
    puts "Değiştirildi: #{entity}"
  end

  def onElementRemoved(entities, entity_id)
    puts "Kaldırıldı; kimlik: #{entity_id}"
  end

  def onEraseEntities(entities)
    puts "Koleksiyondaki öğeler silindi: #{entities}"
  end
end

model = Sketchup.active_model
model.entities.add_observer(EntityEvents.new)

La dernière ligne associe l’observer à la collection entities du modèle actif. onElementAdded est appelé lorsqu’un élément est ajouté ; onElementModified, lorsqu’un ou plusieurs éléments de la collection sont modifiés. onElementRemoved signale la suppression d’un élément. Le paramètre transmis à ce callback doit servir à identifier l’événement de suppression, et non à réutiliser l’élément supprimé. La documentation précise que l’élément supprimé ne doit pas être utilisé à d’autres fins.

Si vous devez également suivre l’état du plan de coupe, vous pouvez ajouter la méthode onActiveSectionPlaneChanged(entities) à la classe. Ce callback est exécuté lorsqu’un plan de coupe de la collection concernée est activé ou lorsque le plan actif est désactivé. Vous pouvez vérifier entities.active_section_plane dans le callback pour déterminer si un plan est actif. N’ajoutez cette méthode que si vous avez aussi besoin de suivre les événements liés aux plans de coupe.

2. Suivre les événements au niveau du modèle

Pour les événements concernant le modèle dans son ensemble, créez une sous-classe de Sketchup::ModelObserver. L’exemple ci-dessous affiche des messages différents lorsqu’une opération comportant des modifications se termine, lorsqu’elle se termine sans modification ou lorsqu’elle est annulée.

ruby
class ModelEvents < Sketchup::ModelObserver
  def onTransactionCommit(model)
    puts "Model değişikliği içeren işlem tamamlandı."
  end

  def onTransactionEmpty(model)
    puts "İşlem tamamlandı; modelde değişiklik yok."
  end

  def onTransactionAbort(model)
    puts "İşlem iptal edildi."
  end
end

Sketchup.active_model.add_observer(ModelEvents.new)

onTransactionCommit est appelé lorsqu’une opération ayant modifié le modèle se termine ; onTransactionEmpty est exécuté lorsqu’une opération a été démarrée puis terminée sans aucune modification. onTransactionAbort signale quant à lui l’annulation d’une opération. La même interface observer comprend également des callbacks pour d’autres événements, comme l’insertion d’un composant, l’enregistrement du modèle ou l’ouverture d’un groupe ou d’un composant par l’utilisateur afin de le modifier.

Le moment d’exécution des callbacks d’opération est un point important. Depuis SketchUp 2016, les événements observer survenant au cours d’une opération sont mis en file d’attente et transmis après le commit de l’opération. Ainsi, des callbacks comme onTransactionStart ne sont pas exécutés en temps réel dès le début de la modification du modèle. Pour une opération comportant des modifications, la notification onTransactionCommit est transmise au moment du commit ; pour une opération terminée sans modification, c’est onTransactionEmpty qui l’est. La notification d’annulation est fournie séparément par onTransactionAbort : ne définissez pas ce callback de la même manière que les notifications de commit ou d’opération vide.

Selon la documentation, l’API ne dispose pas de méthode permettant de vérifier si une opération est actuellement ouverte. Les callbacks d’opération ne conviennent donc pas au suivi en temps réel de l’état d’une opération. La source recommande de les utiliser principalement à des fins de rapport et de débogage. Évitez de démarrer une nouvelle opération qui modifie le modèle depuis un callback : la documentation avertit que de telles modifications peuvent entraîner un plantage ou une corruption du modèle. Les usages axés sur l’observation, comme l’écriture dans la console ou la consignation d’événements, sont mieux adaptés aux exemples.

3. Suivre les instances d’une définition de composant

Utilisez DefinitionObserver pour suivre l’ajout d’instances à une définition de composant ou la suppression d’une instance de cette définition. Dans l’exemple ci-dessous, l’observer est ajouté à une définition de composant du modèle actif.

ruby
class ComponentEvents < Sketchup::DefinitionObserver
  def onComponentInstanceAdded(definition, instance)
    puts "Bileşen örneği eklendi: #{instance}"
  end

  def onComponentInstanceRemoved(definition, instance)
    puts "Bileşen örneği kaldırıldı: #{instance}"
  end
end

definition = Sketchup.active_model.definitions[0]
definition.add_observer(ComponentEvents.new)

onComponentInstanceAdded est appelé lorsqu’une nouvelle instance est ajoutée à la définition surveillée. onComponentInstanceRemoved suit la suppression d’instances de cette définition. L’observer ne surveille que la définition à laquelle il a été ajouté ; pour suivre une autre définition, vous devez également y ajouter un observer. Dans l’exemple, definitions[0] accède à l’une des définitions de composants du modèle actif.

Il existe une exception particulière pour le callback de suppression : en raison du fonctionnement de l’outil Move de SketchUp, onComponentInstanceRemoved peut être exécuté lors d’une opération Move + Copy, même si aucune instance ne semble avoir été supprimée. Ne considérez donc pas le déclenchement du callback comme une preuve suffisante qu’un composant a effectivement été supprimé du modèle.

Erreurs courantes et prochaines étapes

La première erreur consiste à choisir un observer dont le périmètre ne correspond pas à l’événement. Suivre l’ajout d’un élément à une collection de géométrie et surveiller la fin d’une opération au niveau du modèle ne répondent pas au même besoin. Il faut définir le callback dans la bonne classe et ajouter l’observer à la collection, au modèle ou à la définition de composant où l’événement se produit.

Une autre erreur consiste à traiter le paramètre de onElementRemoved comme un élément toujours utilisable. Ce paramètre indique l’identifiant de l’élément supprimé ; selon la documentation, l’élément supprimé ne doit pas être utilisé autrement que pour constater sa suppression. Tenez également compte de l’exception Move + Copy lorsque vous interprétez un événement de suppression dans DefinitionObserver.

Modifier le modèle depuis des callbacks d’opération comporte aussi des risques. Pour vos premiers essais, configurez les callbacks uniquement pour afficher des informations dans la console ou consigner des événements. Observez ensuite quel callback est déclenché par chaque action de l’utilisateur. Lorsque vous examinez des problèmes liés au déroulement des opérations, distinguez les notifications de démarrage, de commit, d’opération vide et d’annulation ; gardez à l’esprit que le callback de démarrage ne signale pas en temps réel le début effectif de l’opération.

Pour la suite, commencez par un seul type d’événement et vérifiez son périmètre et son timing. Lorsque le besoin est clair, ajoutez uniquement les callbacks nécessaires à la classe. Cette méthode aide à limiter le rôle du code d’observation et à mieux comprendre ce que représentent les paramètres des callbacks. Si votre flux de travail nécessite de modifier le modèle, évaluez séparément les limites d’une utilisation sûre des callbacks observer.

Source et licence

Ce guide est adapté de la documentation officielle de l’API Ruby de SketchUp consacrée aux classes EntitiesObserver, ModelObserver et DefinitionObserver. La rubrique consacrée aux licences des sources indique « libre ».

Sources

3 sources
R
ruby.sketchup.comruby.sketchup.com/Sketchup/EntitiesObserver.html
Résumé
R
ruby.sketchup.comruby.sketchup.com/Sketchup/ModelObserver.html
Résumé
R
ruby.sketchup.comruby.sketchup.com/Sketchup/DefinitionObserver.html
Résumé

Les textes sources ne sont pas republiés ; les courtes citations sont signalées, le reste est notre propre résumé et commentaire.

L’avis de 3dsınıfı
3dL’analyse de la rédaction

Pour les agences d’architecture et les équipes de visualisation en Turquie, les observers peuvent faciliter le suivi des événements du modèle et le débogage des extensions SketchUp. Ceux qui développent des outils de suivi des mouvements de géométrie ou de composants peuvent commencer par choisir le périmètre observer adapté.

Les sources ne fournissent pas d’informations sur les tarifs, les exigences matérielles ou les conditions de distribution ; il serait donc inapproprié de généraliser sur ces points. En pratique, il faut notamment tenir compte de l’exécution différée des callbacks d’opération et des risques liés à la modification du modèle depuis un callback. Cette approche semble mieux adaptée à la consignation et au suivi des événements qu’au contrôle en temps réel.

Questions fréquentes

Comment suivre l’ajout de géométrie dans l’API Ruby de SketchUp ?

Définissez `onElementAdded(entities, entity)` dans une sous-classe de `Sketchup::EntitiesObserver`, puis ajoutez l’observer à la collection `Entities` concernée.

Quand les callbacks d’opération de ModelObserver sont-ils exécutés ?

La notification `onTransactionCommit` d’une opération comportant des modifications et la notification `onTransactionEmpty` d’une opération terminée sans modification sont transmises au moment du commit. Un callback distinct, `onTransactionAbort`, est prévu pour les annulations.

DefinitionObserver peut-il être déclenché pendant Move + Copy ?

Oui. Selon la documentation, en raison du fonctionnement de l’outil Move, `onComponentInstanceRemoved` peut être exécuté pendant Move + Copy même si aucune instance ne semble avoir été supprimée.

Les commentaires et le forum sont en turc.Rejoindre la discussion
+

À lire aussi