PropertyManagerPage

Bonjour à tous,

quelques questions au sujet des PropertyManagerPage, en VBA :

  1. Normalement, les controls apparaissent sur le PropertyManagerPage dans l’ordre où ils sont déclarés. Sauf que apparemment les groupes sont prioritaires sur les control sans groupe. C’est une conclusion personnelle, je n’ai pas trouvé d’indication dans la documentation. Est-ce que quelqu’un peut confirmer ?

  2. Est-ce que l’API du PropertyManagerPage permet de reproduire tous les PropertyManager que l’on voit dans solidworks :

    2.1. Dans le PropertyManager Contrainte, on voit des icônes sur les onglets. Je n’ai pas trouvé comment faire la même chose dans un PropertyManagerPage.

    2.2. Dans le PropertyManager Contrainte toujours, il y a du texte après les boutons permettant de selectionner la contrainte. Je sais créer ces bouton, mais je ne sais pas comment ajouter du texte derrière.

Le PropertyManager Contraintes

  1. Où trouver des exemples de gestion de .Net control ou d’ActiveX control dans un
    PropertyManagerPage ? C’est peut-être la solution à mes points 2.1. et 2.2.

Sur le fond, mon PropertyManagerPage fonctionne, il s’agit plus de questions d’ergonomie qu’autre chose.

En vous remerciant

Benoît

Bonjour @binoyte ,

PropertyManagerPage, vaste sujet…
Il permet d’intégrer une interface utilisateur/SW dans l’environnement de SW, avec des composants standard et spécialisés, le tout au look de Solidworks.

Avec trois niveaux de conteneurs : la page elle-même, les fiches à onglets (PropertyManagerPageTab) et les groupes (PropertyManagerPageGroup).
Chaque conteneur peut recevoir des contrôles divers et variés, similaires à ceux d’un UserForm (type Label, TextBox, Button…), et d’autres spécialisés (sélection d’objets SW).

Mais la gestion de la position des contrôles au sein de la page est assez sommaire.
Le problème, c’est que Solidworks définit lui-même la position des contrôles dans la page du PropertyManager, au moins partiellement.
Je m’explique : au départ, une fiche à onglet est créée dans la page. Dans cette fiche sont créés, dans cet ordre, un bouton (PropertyManagerPageButton) et un groupe (PropertyManagerPageGroup). On s’attendrait logiquement à voir le bouton placé au dessus du groupe. En fait, il est placé en dessous, merci SW.
Parce que SW donne la priorité de la position au(x) groupe(s), les boutons viendront après…

Impossible également de gérer finement la position des contrôles au sein d’un même conteneur.
Un Label et un TextBox étant définis dans un même groupe, ils sont par défaut placés l’un sous l’autre avec seulement une indentation, simple ou double.

Il est possible de contourner cette limitation en castant le Label (de type PropertyManagerPageLabel) au type Variant OLE, et le TextBox (de type PropertyManagerPageTextBox) au type Variant OLE. Les contrôles profitent ainsi des propriétés Top et Left de leurs « ancètres » (type PropertyManagerPageControl), ce qui pemet de forcer leurs positions dans le conteneur.
image

Mais là aussi avec des limites puisque SW garde tout cela sous surveillance : la propriété Left semble limitée à l’intervalle [0…100], ce qui rend impossible le placement de plusieurs boutons sur la totalité de la largeur de la page.
Impossible de compléter la ligne avec 4 ou 5 boutons.

image

Quant aux icônes devant les composants de la page, il sont affichés par la méthode SetPictureLabelByName définis pour les contrôles. Là aussi, il faut caster les composants vers le type PropertyManagerPageControl, ou un type neutre Variant OLE.
image

Sans parler de quelques autres misères…

1 « J'aime »

Bonjour;

Un exemple est disponible dans les aides Solidworks:
https://help.solidworks.com/2024/english/api/sldworksapi/Create_PropertyManager_Page_Example_VB.htm
ou une video de SolidXperts:

merci pour ton retour @m_blt !

Dans l’immédiat, caster les objets malgré leur limitation, me satisfera bien.

Par contre, en dehors des types standard du vba comme Cstr je ne sais pas trop comment faire. Set monControl = new Variant OLE ?

@Maclane je connais bien les exemples de l’aide en ligne. C’est d’ailleurs grâce à ça que j’ai pu démarrer. Mais si tu regardes bien, malgré ce qui est dit en haut de la page, il n’y a pas de contrôle ActiveX. Les lignes sont commentées. Et mes recherches pour aller plus loin ont calé.

Par contre je ne connais pas le tuto youtube; Je vais le regarder asap.

Le cast est géré de façon implicite par VBA : un bouton nommé PrMgrButton « pointe » sur un contrôle nommé PrMgrControl par une simple affectation:

dim PrMgrButton as PropertManagerPageButton
dim PrMgrControl as PropertManagerPageControl

set PrMgrControl = PrMgrButton  ' Possible car le bouton est héritier du contrôle

Idem pour un variant :

dim PrMgrButton as PropertManagerPageButton
dim vrtControl as variant

set vrtControl = PrMgrButton  ' Usage de "set" à valider...

impec ! J’ignorai cette technique. Je pense que je vais pouvoir m’en resservir dans d’autres projet.

C’est un peu HS, mais j’ai aussi des soucis en late binding avec l’objet EdmVaultX, je n’arrive pas à avoir un EdmVault où X serai à la bonne valeur, 5 au lieu de 21 ou l’inverse je ne me souviens plus. Et je cherchais comment caster l’objet vers la version EdmVault voulu. Je vais voir si je peux adapter. En Late binding seulement, et c’est le seul choix possible, quand on code pour des les tâches « SW task addin ».

Bref, sinon j’ai encore une question : variant OLE c’est le type variant ou autre chose ?

En VBA, il n’y a qu’un seul type variant, quel que soit l’objet pointé.

A en juger par cette ligne d’un exemple VB.NET, le cast de EdmVaultX est possible entre ses indices successifs…

  Dim CurrentVault As IEdmVault21 = TryCast(New EdmVault5(), IEdmVault21)

Salut,
en vb.net oui c’est possible, et en vba aussi, à condition d’être en early binding, c’est à dire, quand tu coches les références dans le projet. Tu peux écrire :

Dim eVault As IEdmVault21
Set eVault = New EdmVault5

Et tu obtiens un objet IEdmVault21/IEdmVault21 (à mon avis il y a une erreur, on devrait avoir IEdmVault5/IEdmVault21) :
{A14B1B02-D76A-4F55-B7E7-B78398D569C4}

Sauf que quand tu codes un tâche solidworks (SolidWorks Tasks addin), tu ne peux pas cocher les références. Par conséquent il faut créer l’objet en late binding :

Dim eVault As Object 'Futur objet EdmVault21
Set eVault = CreateObject("ConisioLib.EdmVault.1")

Contrairement à ce que l’on pourrait croire, le chiffre à la fin n’est pas l’indice de l’objet. J’obtiens ainsi un objet de type Object/IEdmVault21.
{6E1FDD15-2E19-415C-B404-D1BB7F4D4330}

Et les deux ne sont pas équivalents. Si par la suite j’écris :

Dim eFile As Object  'Futur objet IEdmFile6
Set eFile = eVault.GetFileFromPath(sFichier)

J’obtiens un une erreur 13 : type mismatch. Ça file tout seul par contre en early binding. Et ça se comprend, la méthode GetFileFromPath est membre de IEdmVault5.

Et là pour caster, en late binding, ben je ne sais pas faire