]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Intersection par un plan gni/evolution
authorGérald NICOLAS <gerald.nicolas@edf.fr>
Mon, 3 Jul 2023 13:28:08 +0000 (15:28 +0200)
committerGérald NICOLAS <gerald.nicolas@edf.fr>
Mon, 3 Jul 2023 13:28:08 +0000 (15:28 +0200)
src/PythonAddons/Test/TestmidSurface_1.py
src/PythonAddons/Test/TestmidSurface_2.py
src/PythonAddons/macros/midSurface/surfaceMediane.py

index 0ed5c0e54ab2053bfabfaafebc5079bb0d186f09..fda5f3995e1af8f5bd25d56b7077245929f2a542 100755 (executable)
@@ -46,7 +46,7 @@ aSession.finishOperation()
 #for cle in ("Construction", "Bodies", "Groups", "Folders"):
   #print (cle,":",aPart.size(cle))
 
-assert(aPart.size("Construction") == 7), "Right number of construction: {}".format(aPart.size("Construction"))
-assert(aPart.size("Bodies") == 8), "Right number of construction: {}".format(aPart.size("Bodies"))
-assert(aPart.size("Groups") == 2), "Right number of construction: {}".format(aPart.size("Groups"))
+assert(aPart.size("Construction") == 8), "Right number of construction: {}".format(aPart.size("Construction"))
+assert(aPart.size("Bodies") == 7), "Right number of bodies: {}".format(aPart.size("Bodies"))
+assert(aPart.size("Groups") == 2), "Right number of groups: {}".format(aPart.size("Groups"))
 assert(aPart.size("Folders") == 4), "Wrong number of folders: {}".format(aPart.size("Folders"))
index db90421f6a91c331bc5d32cb4338911b5e05989b..cba493c48dd17dadc895695f239e10d32fcd33f0 100755 (executable)
@@ -47,6 +47,6 @@ aSession.finishOperation()
   #print (cle,":",aPart.size(cle))
 
 assert(aPart.size("Construction") == 32), "Right number of construction: {}".format(aPart.size("Construction"))
-assert(aPart.size("Bodies") == 24), "Right number of construction: {}".format(aPart.size("Bodies"))
-assert(aPart.size("Groups") == 10), "Right number of construction: {}".format(aPart.size("Groups"))
+assert(aPart.size("Bodies") == 26), "Right number of bodies: {}".format(aPart.size("Bodies"))
+assert(aPart.size("Groups") == 10), "Right number of groups: {}".format(aPart.size("Groups"))
 assert(aPart.size("Folders") == 13), "Wrong number of folders: {}".format(aPart.size("Folders"))
index 04990d102e3c0aeb506b5f5a9d52c87024154e43..31abc3fe7c678d663c0456142f7a570ae41669aa 100755 (executable)
@@ -36,7 +36,7 @@ guillaume.schweitzer@blastsolutions.io
 Gérald NICOLAS
 """
 
-__revision__ = "V11.27"
+__revision__ = "V11.28"
 
 #========================= Les imports - Début ===================================
 
@@ -278,7 +278,7 @@ Entrées :
 def exec_nom (fonction, nom=None, couleur=None):
   """Exécute la fonction puis éventuellement la nomme et nomme son résultat ; Couleur éventuelle
 
-Attention : il faut commencer par exécuter la fonction sinon l enommage n'est pas cohérent en mode macro. Mystère...
+Attention : il faut commencer par exécuter la fonction sinon lnommage n'est pas cohérent en mode macro. Mystère...
 
 Entrées :
   :fonction: fonction à traiter
@@ -817,13 +817,12 @@ Entrées :
 
 #=========================== Début de la méthode =================================
 
-  def _cree_face_mediane ( self, solide, caract_face_1, caract_face_2, tb_caract, n_recur ):
+  def _cree_face_mediane ( self, solide, caract_face_1, caract_face_2, n_recur ):
     """Crée la face médiane entre deux autres
 
 Entrées :
   :solide: solide SHAPER à traiter
   :caract_face_1, caract_face_2: les caractéristiques des 2 faces les plus grandes
-  :tb_caract: tableau des caractéristiques géométriques des faces
   :n_recur: niveau de récursivité
 
 Sorties :
@@ -847,7 +846,7 @@ Sorties :
 # 2. Traitement selon la forme de la face
 # 2.1. Face plane
     if forme in ( "Disk", "Plane", "Rectangle" ):
-      erreur, face = self._cree_face_mediane_plane ( solide, caract_face_1, caract_face_2, tb_caract, n_recur )
+      erreur, face = self._cree_face_mediane_plane ( solide, caract_face_1, caract_face_2, n_recur )
 
 # 2.2. Face cylindrique
     elif ( forme == "Cylinder" ):
@@ -921,13 +920,12 @@ Entrées :
 
 #=========================== Début de la méthode =================================
 
-  def _cree_face_mediane_plane ( self, solide, caract_face_1, caract_face_2, tb_caract, n_recur ):
+  def _cree_face_mediane_plane ( self, solide, caract_face_1, caract_face_2, n_recur ):
     """Crée la face médiane entre deux autres - cas des surfaces planes
 
 Entrées :
   :solide: l'objet solide à traiter
   :caract_face_1, caract_face_2: les caractéristiques des 2 faces les plus grandes
-  :tb_caract: tableau des caractéristiques géométriques des faces
   :n_recur: niveau de récursivité
 
 Sorties :
@@ -940,14 +938,14 @@ Sorties :
       print_tab (n_recur, blabla)
 
 #   Caractéristiques des surfaces
-    coo_x, coo_y, coo_z, vnor_x, vnor_y, vnor_z, taille, d_face_1_2 = self._cree_face_mediane_plane_0 ( solide, caract_face_1, caract_face_2, tb_caract, n_recur )
+    coo_x, coo_y, coo_z, vnor_x, vnor_y, vnor_z, d_face_1_2 = self._cree_face_mediane_plane_0 ( caract_face_1, caract_face_2, n_recur )
 
 #   Contrôle de la validité de l'épaisseur
     erreur = self._verif_epaisseur ( d_face_1_2 )
 
 #   Création de la face
     if not erreur:
-      face = self._cree_face_mediane_plane_1 ( solide, (coo_x, coo_y, coo_z),(vnor_x, vnor_y, vnor_z), taille, d_face_1_2, n_recur )
+      face = self._cree_face_mediane_plane_1 ( solide, (coo_x, coo_y, coo_z),(vnor_x, vnor_y, vnor_z), d_face_1_2, n_recur )
     else:
       face = None
 
@@ -957,21 +955,18 @@ Sorties :
 
 #=========================== Début de la méthode =================================
 
-  def _cree_face_mediane_plane_0 ( self, solide, caract_face_1, caract_face_2, tb_caract, n_recur ):
+  def _cree_face_mediane_plane_0 ( self, caract_face_1, caract_face_2, n_recur ):
     """Crée la face médiane entre deux autres - cas des surfaces planes
 
 Décodage des caractéristiques
 
 Entrées :
-  :solide: l'objet solide à traiter
   :caract_face_1, caract_face_2: les caractéristiques des 2 faces les plus grandes
-  :tb_caract: tableau des caractéristiques géométriques des faces
   :n_recur: niveau de récursivité
 
 Sorties :
   :coo_x, coo_y, coo_z: coordonnées du centre de la base
   :vnor_x, vnor_y, vnor_z: coordonnées du vecteur normal
-  :taille: estimation de la taille de la future face
   :d_face_1_2: la distance entre les deux faces
 """
 
@@ -993,28 +988,20 @@ Sorties :
     vnor_y = caract_face_1[2][5]
     vnor_z = caract_face_1[2][6]
 
-# 2. Taille
-
-#   taille : une longueur caractéristique pour être certain de tout prendre
-    l_diag = self._calcul_lg_caract_0 ( solide, tb_caract, n_recur )
-    taille = 10.*l_diag
-    if self._verbose_max:
-      print_tab (n_recur, "Taille englobante : ", taille)
-
-# 3. Distance entre les deux faces
+# 2. Distance entre les deux faces
     face_1 = caract_face_1[0]
     face_2 = caract_face_2[0]
     d_face_1_2 = GeomAlgoAPI_ShapeTools.minimalDistance(face_1, face_2)
     if self._verbose_max:
       print_tab (n_recur, "Distance entre les deux faces = ", d_face_1_2)
 
-    return coo_x, coo_y, coo_z, vnor_x, vnor_y, vnor_z, taille, d_face_1_2
+    return coo_x, coo_y, coo_z, vnor_x, vnor_y, vnor_z, d_face_1_2
 
 #===========================  Fin de la méthode ==================================
 
 #=========================== Début de la méthode =================================
 
-  def _cree_face_mediane_plane_1 ( self, solide, coo_c, vnor, taille, d_face_1_2, n_recur ):
+  def _cree_face_mediane_plane_1 ( self, solide, coo_c, vnor, d_face_1_2, n_recur ):
     """Crée la face médiane entre deux autres - cas des surfaces planes
 
 Création des objets de construction et de la face médiane
@@ -1023,7 +1010,6 @@ Entrées :
   :solide: l'objet solide à traiter
   :coo_c: coordonnées du centre de la base
   :vnor: coordonnées du vecteur normal
-  :taille: estimation de la taille de la future face
   :d_face_1_2: la distance entre les deux faces
   :n_recur: niveau de récursivité
 
@@ -1037,17 +1023,13 @@ Sorties :
       print_tab (n_recur, blabla)
       print_tab (n_recur, "Centre   : ({}, {}, {})".format(coo_c[0], coo_c[1], coo_c[2]))
       print_tab (n_recur, "Normale  : ({}, {}, {})".format(vnor[0], vnor[1], vnor[2]))
-      print_tab (n_recur, "Taille   : ", taille)
       print_tab (n_recur, "Distance entre les deux faces : ", d_face_1_2)
 
 # 1. Préalables
-    _, v_norm, plan = self._cree_centre_axe_plan ( coo_c, vnor, self.nom_solide, n_recur )
+    _, _, plan = self._cree_centre_axe_plan ( coo_c, vnor, self.nom_solide, n_recur )
 
-# 2. Création de l'esquisse
-    sketch = self._cree_face_mediane_plane_1_a ( plan, taille, n_recur )
-
-# 3. La face
-    face = self._cree_face_mediane_plane_1_b ( solide, sketch, v_norm, d_face_1_2, n_recur )
+# 2. La face
+    face = self._cree_face_mediane_plane_1_a ( solide, plan, d_face_1_2, n_recur )
 
     #print ("fin de {}".format(nom_fonction))
 
@@ -1057,66 +1039,14 @@ Sorties :
 
 #=========================== Début de la méthode =================================
 
-  def _cree_face_mediane_plane_1_a ( self, plan, taille, n_recur ):
-    """Crée la face médiane entre deux autres - cas des surfaces planes - l'esquisse
-
-Entrées :
-  :plan: plan
-  :taille: estimation de la taille de la future face
-  :n_recur: niveau de récursivité
-
-Sorties :
-  :sketch: l'esquisse
-"""
-
-    nom_fonction = __name__ + "/_cree_face_mediane_plane_1_a"
-    blabla = "Dans {} :".format(nom_fonction)
-    if self._verbose_max:
-      print_tab (n_recur, blabla)
-      print_tab (n_recur, "Plan      : {}".format(plan.name()))
-      print_tab (n_recur, "taille    : {}".format(taille))
-
-    sketch = model.addSketch(self.part_doc, model.selection("FACE", plan.name()))
-    sketch.execute(True)
-
-    ### Create SketchLine
-    SketchLine_1 = sketch.addLine(-taille/2., taille/2., taille/2., taille/2.)
-    SketchLine_1.execute(True)
-
-    ### Create SketchLine
-    SketchLine_2 = sketch.addLine(taille/2., taille/2., taille/2., -taille/2.)
-    SketchLine_2.execute(True)
-
-    ### Create SketchLine
-    SketchLine_3 = sketch.addLine(taille/2., -taille/2., -taille/2., -taille/2.)
-    SketchLine_3.execute(True)
-
-    ### Create SketchLine
-    SketchLine_4 = sketch.addLine(-taille/2., -taille/2., -taille/2., taille/2.)
-    SketchLine_4.execute(True)
-
-    model.do()
-
-    nom_sketch = "{}_esquisse".format(self.nom_solide)
-    exec_nom (sketch,nom_sketch)
-
-    #print ("fin de {}".format(nom_fonction))
-
-    return sketch
-
-#===========================  Fin de la méthode ==================================
-
-#=========================== Début de la méthode =================================
-
-  def _cree_face_mediane_plane_1_b ( self, solide, sketch, v_norm, d_face_1_2, n_recur ):
+  def _cree_face_mediane_plane_1_a ( self, solide, plan, d_face_1_2, n_recur ):
     """Crée la face médiane entre deux autres - cas des surfaces planes
 
 Création de la face médiane
 
 Entrées :
   :solide: l'objet solide à traiter
-  :sketch: l'esquisse
-  :v_norm: vecteur normal
+  :plan: plan de l'une des grandes faces
   :d_face_1_2: la distance entre les deux faces
   :n_recur: niveau de récursivité
 
@@ -1124,15 +1054,13 @@ Sorties :
   :face: la face médiane
 """
 
-    nom_fonction = __name__ + "/_cree_face_mediane_plane_1_b"
+    nom_fonction = __name__ + "/_cree_face_mediane_plane_1_a"
     blabla = "Dans {} :".format(nom_fonction)
     if self._verbose_max:
       print_tab (n_recur, blabla)
-      print_tab (n_recur, "Esquisse : ", sketch.name())
       print_tab (n_recur, "Distance entre les deux faces : ", d_face_1_2)
 
 # 1. Copie du solide pour gérer les intersections
-    #Copy_1 = model.addCopy(self.part_doc, [model.selection("COMPOUND", "all-in-{}".format(self.nom_solide_aux))], 1)
     Copy_1 = model.addMultiTranslation(self.part_doc, [model.selection("SOLID", self.nom_solide_aux)], model.selection("EDGE", "PartSet/OX"), 0, 1, keepSubResults = True)
     nom = "{}_Copy_1".format(self.nom_solide_aux)
     exec_nom (Copy_1,nom)
@@ -1150,19 +1078,24 @@ Sorties :
 # 2. Création d'une face ; on la translate d'une demi-épaisseur.
     for iaux in range(2):
 
-# 2.1. Création d'une face à partir du sketch et translation perpendiculaire au plan de la face
+# 2.1. Création d'un nouveau plan par translation perpendiculaire au plan de la face
 #      On essaie les 2 côtés alternativement car on ne sait pas lequel sera le bon
+      d_trans = 0.5*d_face_1_2*float(2*iaux-1)
 
-      d_trans = -0.5*d_face_1_2*float(2*iaux-1)
+      planbis = model.addPlane(self.part_doc, model.selection("FACE", "all-in-{}".format(plan.name())), d_trans, False)
+      nom = "{}_plan_{}".format(self.nom_solide_aux,iaux)
+      exec_nom (planbis,nom)
 
-      face = self._cree_face_mediane_plane_2 ( sketch.name(), v_norm.name(), nom_solide, d_trans, iaux, n_recur )
+# 2.2. Intersection de ce plan avec le solide initial
+      face = model.addCommon(self.part_doc, [model.selection("COMPOUND", "all-in-{}".format(nom_solide))], [model.selection("FACE", "all-in-{}".format(planbis.name()))], keepSubResults = True)
+      nom = "{}_face_{}".format(self.nom_solide_aux,iaux)
+      exec_nom (face,nom)
 
-# 2.2. Si on est du bon côté, alors on intersecte la face avec le solide et c'est bon
+# 2.3. Si on est du bon côté, c'est bon
       if face.results():
-        face = self._cree_face_mediane_plane_11 ( face, Recover_1, n_recur )
         break
 
-# 2.3. Si l'intersection est vide, on crée une nouvelle copie du solide avant de tester l'autre côté
+# 2.4. Si l'intersection est vide, on crée une nouvelle copie du solide avant de tester l'autre côté
       else:
         if self._verbose_max:
           print_tab (n_recur, "L'intersection est vide. On essaie l'autre côté")
@@ -1182,133 +1115,6 @@ Sorties :
 
 #===========================  Fin de la méthode ==================================
 
-#=========================== Début de la méthode =================================
-
-  def _cree_face_mediane_plane_11 ( self, face, Recover_1, n_recur ):
-    """Crée la face médiane entre deux autres - cas des surfaces planes
-
-Création des objets de construction et de la face médiane
-
-Entrées :
-  :face: la face médiane
-  :Recover_1: la récupératiuon du solide
-  :n_recur: niveau de récursivité
-
-Sorties :
-  :face: la face médiane
-"""
-
-    nom_fonction = __name__ + "/_cree_face_mediane_plane_11"
-    blabla = "Dans {} :".format(nom_fonction)
-    if self._verbose_max:
-      print_tab (n_recur, blabla)
-      print_tab (n_recur, "face : ", face.name())
-
-    # Si on traite un objet solide unique, on le récupère
-    if ( self.nom_solide_aux == self.objet_principal.name() ):
-      if self._verbose_max:
-        print_tab (n_recur, "On traite un objet solide unique ==> on le récupère.")
-      Recover_2 = model.addRecover(self.part_doc, face, [Recover_1.result()])
-      nom = "{}_Recover_2".format(self.nom_solide_aux)
-      exec_nom (Recover_2,nom)
-
-    nb_inter = face.result().numberOfSubs()
-    if self._verbose_max:
-      print_tab (n_recur, "Nombre d'intersections : ", nb_inter)
-
-    if (nb_inter > 1 ):
-      face = self._cree_face_mediane_plane_3 ( face )
-
-    return face
-
-#===========================  Fin de la méthode ==================================
-
-#=========================== Début de la méthode =================================
-
-  def _cree_face_mediane_plane_2 ( self, nom_sketch, nom_normal, nom_solide, d_trans, icpt, n_recur ):
-    """Crée la face médiane entre deux autres - cas des surfaces planes
-
-Intersection de la face avec le solide
-
-Entrées :
-  :nom_sketch: nom de l'esquisse
-  :nom_normal: nom du vecteur normal
-  :nom_solide: nom du solide à intersecter
-  :d_trans: la distance de translation
-  :icpt: numéro de la tentative
-
-Sorties :
-  :face: la face médiane
-"""
-
-    nom_fonction = __name__ + "/_cree_face_mediane_plane_2"
-    blabla = "Dans {} :".format(nom_fonction)
-    if self._verbose_max:
-      print_tab (n_recur, blabla)
-      print_tab (n_recur, "nom_sketch : ", nom_sketch)
-      print_tab (n_recur, "nom_normal : ", nom_normal)
-      print_tab (n_recur, "nom_solide : ", nom_solide)
-      print_tab (n_recur, "d_trans    : ", d_trans)
-
-    # Création d'une face
-    Face_1 = model.addFace(self.part_doc, [model.selection("COMPOUND", "all-in-{}".format(nom_sketch))])
-    nom = "{}_Face_1_{}".format(self.nom_solide_aux,icpt)
-    exec_nom (Face_1,nom)
-    if self._verbose_max:
-      print_tab (n_recur, "Après addFace pour Face_1 de nom ", nom)
-
-#   On la translate
-    Translation_1 = model.addTranslation(self.part_doc, [model.selection("FACE", Face_1.result().name())], axis = model.selection("EDGE", nom_normal), distance = d_trans, keepSubResults = True)
-    nom = "{}_trans_{}".format(self.nom_solide_aux,icpt)
-    exec_nom (Translation_1,nom)
-    if self._verbose_max:
-      print_tab (n_recur, "Après addTranslation pour Translation_1 de nom ", nom)
-    Translation_1.result().setColor(85, 0, 255)
-
-#   Intersection de cette face avec le solide initial
-    face = self._creation_face_inter ( Translation_1.result().name(), nom_solide )
-
-    return face
-
-#===========================  Fin de la méthode ==================================
-
-#=========================== Début de la méthode =================================
-
-  def _cree_face_mediane_plane_3 ( self, face ):
-    """Crée la face médiane entre deux autres - cas des surfaces planes
-
-Fusion des 2 intersections
-
-Entrées :
-  :face: la face médiane composée de plusieurs intersections
-
-Sorties :
-  :face_m: la face médiane
-"""
-
-    nom_fonction = __name__ + "/_cree_face_mediane_plane_3"
-    blabla = "Dans {} :\n".format(nom_fonction)
-    if self._verbose_max:
-      texte = blabla
-      print (texte)
-
-# Nommage des sous-objets
-    l_fuse = list()
-    for iaux in range(face.result().numberOfSubs()):
-      nom = "{}_common_{}".format(self.nom_solide_aux,iaux)
-      face.result().subResult(iaux).setName(nom)
-      l_fuse.append(model.selection("FACE", '{}'.format(nom)))
-
-#   Fusion
-    if self._verbose_max:
-      print ("Fusion de {} faces.".format(len(l_fuse)))
-    face_m = model.addFuse(self.part_doc, l_fuse, keepSubResults = True)
-    face_m.execute(True)
-
-    return face_m
-
-#===========================  Fin de la méthode ==================================
-
 #=========================== Début de la méthode =================================
 
   def _cree_face_mediane_cylindre ( self, solide, caract_face_1, caract_face_2, n_recur ):
@@ -2249,7 +2055,7 @@ Sorties :
 
 # 4. Création de la face médiane
 
-      erreur, face = self._cree_face_mediane ( solide, caract_face_1, caract_face_2, tb_caract, n_recur )
+      erreur, face = self._cree_face_mediane ( solide, caract_face_1, caract_face_2, n_recur )
       if ( erreur or ( face is None ) ):
         break