Le class J de Chris_G

Forum destiné aux questions et discussions en français
Forum rules
Règles du forum et informations utiles.

VEUILLEZ LIRE CECI AVANT DE DEMANDER DE L'AIDE
jean.thil
Posts: 209
Joined: Tue Jul 28, 2015 7:28 am

Le class J de Chris_G

Postby jean.thil » Mon Jun 27, 2016 6:48 am

Bonjour,

J'ai vu avec admiration le class J de Chris_G. viewtopic.php?f=24&t=16100

Je ne comprends pas les étapes.
Comment se fait la discrétisation ? Dans FC ou dans un autre logiciel ?

Dans la macro

Code: Select all

import Part
import Points
import ReverseEngineering

# create the names of the half-hull lines
profNames = []
for i in range(31):
    name = 'Shape0'+str(54+i)
    profNames.append(name)
profNames.append('Shape')

# Discretize the curves and put the points in a Points object of the Pointcloud WB
nbLines = 30 # nb of samples for the half-hull lines
ptcl = Points.Points()

for p in profNames:
    ptcl.addPoints(App.ActiveDocument.getObject(p).Shape.discretize(Number=nbLines))

# the 2 rail curves : 800 samples
ptcl.addPoints(App.ActiveDocument.getObject('Shape085').Shape.discretize(Number=800))
ptcl.addPoints(App.ActiveDocument.getObject('Shape089').Shape.discretize(Number=800))

# create an approximating nurbs surface with smoothing algorithm
s = ReverseEngineering.approxSurface(Points = ptcl, UDegree = 3, VDegree = 3, NbUPoles = 20, NbVPoles = 12, Weight = 1.0, Grad = 1.0, Bend = 1.0, Curv = 1.0, Iterations = 20, PatchFactor = 1.01 )
Part.show(s.toShape())
App.ActiveDocument.recompute()
À quoi correspond Points (dans imports points) ?
Dans ptcl.addPoints(App.ActiveDocument.getObject(p).Shape.discretize(Number=nbLines)) que signifie Number=nbLines ?


Merci d'avance
mario52
Posts: 3235
Joined: Wed May 16, 2012 2:13 pm

Re: Le class J de Chris_G

Postby mario52 » Mon Jun 27, 2016 9:47 am

Bonjour
jean.thil wrote:Comment se fait la discrétisation ? Dans FC ou dans un autre logiciel ?
la discrétisation va chercher les coordonnées d'un point à une distance définie sur la longueur de la ligne (dans les points constituants la ligne)
comment elle se fait ? je suppose que la fonction calcule la normale d'une coordonnée à un autre (pour une ligne droite) ! mais je ne sais pas
jean.thil wrote:À quoi correspond Points (dans imports points) ?
importe dans la macro le module Points
jean.thil wrote:Dans ptcl.addPoints(App.ActiveDocument.getObject(p).Shape.discretize(Number=nbLines)) que signifie Number=nbLines ?
il correspond au nombre de coupure (discrétisation) défini dans cette ligne

Code: Select all

# Discretize the curves and put the points in a Points object of the Pointcloud WB
nbLines = 30 # nb of samples for the half-hull lines
Number= variable définissant le nombre de coupures dans la fonction
nbLines est la variable définie à 30 dans la macro, donc 30 coupures

j'utilise beaucoup cette fonction dans mes macro ici un simple exemple Macro_Cut_Line
et ici un plus gros Macro_FC_Convert_Lines

mario
Maybe you need a special feature, go into Macros_recipes and Code_snippets, Topological_data_scripting, Dialog creation. My macros on Gist.github.
jean.thil
Posts: 209
Joined: Tue Jul 28, 2015 7:28 am

Re: Le class J de Chris_G

Postby jean.thil » Mon Jun 27, 2016 7:25 pm

Merci de ta réponse et des liens. Je vais essayer de faire un truc ressemblant.
User avatar
Chris_G
Posts: 1503
Joined: Tue Dec 31, 2013 4:10 pm
Location: France
Contact:

Re: Le class J de Chris_G

Postby Chris_G » Wed Jun 29, 2016 9:57 am

Bonjour Jean,
Je viens de tomber par hasard sur ce sujet ( je ne visite jamais le forum français ).
Je suis très flatté que le bateau te plaise :D
La fonction "discretize" fonctionne sur les arêtes ( edges ) :
Discretizes the edge and returns a list of points.
The function accepts keywords as argument:
discretize(Number=n) => gives a list of 'n' equidistant points
discretize(QuasiNumber=n) => gives a list of 'n' quasi equidistant points (is faster than the method above)
discretize(Distance=d) => gives a list of equidistant points with distance 'd'
discretize(Deflection=d) => gives a list of points with a maximum deflection 'd' to the edge
discretize(QuasiDeflection=d) => gives a list of points with a maximum deflection 'd' to the edge (faster)
discretize(Angular=a,Curvature=c,[Minimum=m]) => gives a list of points with an angular deflection of 'a'
and a curvature deflection of 'c'. Optionally a minimum number of points
can be set which by default is set to 2.

Optionally you can set the keywords 'First' and 'Last' to define a sub-range of the parameter range
of the edge.

If no keyword is given then it depends on whether the argument is an int or float.
If it's an int then the behaviour is as if using the keyword 'Number', if it's float
then the behaviour is as if using the keyword 'Distance'.

Example:

import Part
e=Part.makeCircle(5)
p=e.discretize(Number=50,First=3.14)
s=Part.Compound([Part.Vertex(i) for i in p])
Part.show(s)


p=e.discretize(Angular=0.09,Curvature=0.01,Last=3.14,Minimum=100)
s=Part.Compound([Part.Vertex(i) for i in p])
Part.show(s)
La fonction "approxSurface" du module ReverseEngineering, à la fin du script, travaille avec un nuage de points, d'où la necessité de passer par le module Points :

Code: Select all

import Points
ptcl = Points.Points() # creation d'un objet "nuage de points"
ptcl.addPoints( ... ) # ajoute des points dans le nuage
Dis-moi, si tu souhaites d'autres documents intermédiaires ( image du plan scanné, fichier SVG, etc ... )
Christophe
jean.thil
Posts: 209
Joined: Tue Jul 28, 2015 7:28 am

Re: Le class J de Chris_G

Postby jean.thil » Wed Jun 29, 2016 8:27 pm

Salut,

Merci de ta réponse. C'est nettement plus claire dans ma tête. Je voudrais essayer de modéliser un voilier traditionnel style chaloupe sardinière pour laquelle j'ai des vues 3 plans.
User avatar
Chris_G
Posts: 1503
Joined: Tue Dec 31, 2013 4:10 pm
Location: France
Contact:

Re: Le class J de Chris_G

Postby Chris_G » Wed Jun 29, 2016 9:23 pm

OK,
Je dois avouer que ce que j'ai fait tient plus de la bidouille ou du bricolage que d'une belle modélisation digne de ce nom.
Idéalement, la fonction à utiliser sur les courbes serait un balayage de profils s'appuyant sur 2 rails ( cherche "sweep 2 rails" dans Google ).
Ci-dessous : profiles en noir, rails en vert
Curves-4.jpeg
Curves-4.jpeg (12.84 KiB) Viewed 1712 times
En fait, la véritable difficulté, c'est que les profils doivent être "approximés" ( parce qu'ils ont été retracés par dessus un plan, ils ne sont pas parfaits, et qu'il y en a beaucoup (trop ?) ) et les 2 rails devraient être "interpolés" ( on voudrait que la surface passe exactement par ces 2 rails ).
Malheureusement, cette fonction n'existe pas encore dans FC.
La fonction que j'utilise génère une surface "non découpée", qui s'étend au-delà des courbes fournies, et qui doit être ensuite recoupée.
De plus, c'est une surface approximative, qui ne suit pas exactement les 2 rails, en particulier celui du bas, la ligne de quille.
Curves-5.jpeg
Curves-5.jpeg (15.2 KiB) Viewed 1712 times
Christophe
cedric
Posts: 40
Joined: Mon Jun 13, 2016 8:58 am

Re: Le class J de Chris_G

Postby cedric » Thu Jun 30, 2016 8:43 am

Bonjour,

Très jolie bateau

Bien que le début de ce sujet c'est du chinois pour moi :D

Quand tu parles de Profils et de Rails je comprends un peu mieux
2 Rails je trouve cela un peu juste pour tous ces profils ?
Normalement, plus tu as de rails, meilleur est ta surface ....
User avatar
NormandC
Posts: 18534
Joined: Sat Feb 06, 2010 9:52 pm
Location: Québec, Canada

Re: Le class J de Chris_G

Postby NormandC » Sun Jul 03, 2016 3:27 am

cedric wrote:Normalement, plus tu as de rails, meilleur est ta surface ....
Au contraire, il ne faut pas mettre trop de rails, ni trop de profils, car si on contraint trop une surface, on récolte des déformations un peu partout. M'enfin, d'après mon expérience limitée en la matière...

La génération de surfaces est un art. Je n'ai travaillé que sur un seul projet avec des surfaces complexes (1 produit commercialisé, l'autre mis au rancart apparemment :cry: ), et avec un logiciel de milieu de gamme (Solid Edge) dont les outils surfaciques étaient limités... :?
jean.thil
Posts: 209
Joined: Tue Jul 28, 2015 7:28 am

Re: Le class J de Chris_G

Postby jean.thil » Sun Jul 03, 2016 7:16 am

Effectivement.
Voilà où j'en suis. J'ai tracé tous les couples mais c'est en en laissant 2 de côté que j'ai eu le moins mauvais résultat.
C'est une forme difficile car le retour de galbord vertical et la quille massive empêchent d'avoir un point d'appui pour les courbes toujours à la coordonnée
X = 0.
ch1.jpeg
ch1.jpeg (65.09 KiB) Viewed 1654 times
De toutes manières, il va falloir que je reprenne le couple 01
Petite question : est-il possible de faire une nurbs dans un plan en diagonale pour faire le tableau arrière ?
J'aimerais bien avoir les nurbs dans le sketcher...
User avatar
NormandC
Posts: 18534
Joined: Sat Feb 06, 2010 9:52 pm
Location: Québec, Canada

Re: Le class J de Chris_G

Postby NormandC » Sun Jul 03, 2016 12:36 pm

jean.thil wrote:Petite question : est-il possible de faire une nurbs dans un plan en diagonale pour faire le tableau arrière ?
Il n'y a pas de raison pour que ce ne le soit pas. Je suppose que tu utilises l'outil BSpline de l'atelier Draft? Là où ça se corse c'est de définir le plan de travail.

Peut-être qu'il serait plus facile d'installer la macro Work Feature afin de créer un plan. Ce plan peut ensuite être utilisé pour définir le plan de travail dans l'atelier Draft : il suffit de sélectionner le plan avant de cliquer sur le bouton définissant un plan de travail.

Sinon tu pourrais créer un plan depuis l'outil Image Créer des primitives de l'atelier Part, puis en modifier son positionnement (menu Édition --> Positionnement).
jean.thil wrote:J'aimerais bien avoir les nurbs dans le sketcher...
Tu n'es pas le seul. Mais tant qu'un dev ne se portera pas volontaire pour le faire... :|