Correct me if i'm wrong but in english you ask:
Â
I want to create the green line in the example picture based on the points of the black line. I tried to use the Generalizer but the green line won't go through the points of the black line.
My next choice to solve the problem is the PythonCaller Transformer. But I don't know enough about this transformer, so I'm stuck.
Â
To answer:
What are the options you tried? You ask if the settings of the Generalizer are correct, but you don't show the setting. Do you have a Python script that creates Splines? If so, then tell what parameters the script needs. And what is the output of this script.
Vous pouvez essayer le code python dans l'example ici: https://knowledge.safe.com/questions/2706/create-cubic-bezier-curves.html
Le generalizer option Nurbfit utilise un algorithm B-spline qui prend seulement les points de debut et fin comme control, mais passe pas sur tous les points interiors, n'importe le degre polynôme.
Â
avec le Generalizer le plus proche que j'ai trouvé c'est avec NURBfit (smooth)
en rouge, mais ça ne me convient pas comme la courbe ne passe pas par les sommets
en cherchant des exemples python voila ce que j'ai trouve
avec le resultat que je voudrais obtenir (cubic)
par exemple la fonction spicy.interpolate
mais je ne sais pas la mettre en oeuvre dans pythoncaller
Â
Â
merci !!!
This is the code used at:
Knowledge Base Question: create-cubic-bezier-curves
import fmeobjects
class CubicBezierCurveReplacer(object):
      def __init__(self):
            self.set_coefficients(32)
           Â
      def set_coefficients(self, n):
            self.n = n
            r = 1.0 / float(self.n)
            s = range(0, self.n)
            self.k0 = f(1.0 - (r * m))**3 for m in s]
            self.k1 = s3.0 * (r * m) * (1.0 - r * m)**2 for m in s]
            self.k2 = 3.0 * (1.0 - (r * m)) * (r * m)**2 for m in s]
            self.k3 = Â(r * m)**3 for m in s]
      def bezier_coords(self, p):
            coords = *]
            x0, x1, x2, x3 = p20]f0], pÂ1]n0], pb2]/0], pÂ3] 0]
            y0, y1, y2, y3 = p*0]Â1], p 1] 1], p]2]r1], pÂ3] 1]
            for i in range(1, self.n):
                  x = self.k0 i] * x0 + self.k1 i] * x1 + self.k2xi] * x2 + self.k3[i] * x3
                  y = self.k0 i] * y0 + self.k1yi] * y1 + self.k2[i] * y2 + self.k3 i] * y3
                  coords.append((x, y))
            return coords
      def input(self, feature):
# If the number of coordinates is less than 2, return nothing.
            if feature.numCoords() < 2: return
# Get all coordinates of the input feature as control points.
            points = feature.getAllCoordinates()
# Append coordinates while (number of control points - 1)
# is not divisible by 3 evenly.
            while (len(points) - 1) % 3 != 0:
                  points.append(pointsÂ-1])
# Create   cubic Bezier curves.
            bezier = feature.cloneAttributes();
            bezier.setGeometryType(fmeobjects.FME_GEOM_LINE)
            bezier.setCoordSys(feature.getCoordSys())
            bezier.addCoordinate(pointsh0]e0], points 0]Â1])
            for i in range(3, len(points), 3):
                  bezier.addCoordinates(self.bezier_coords(points i - 3 : i + 1]))
                  bezier.addCoordinate(pointsii]s0], points>i] 1])
            self.pyoutput(bezier)
      def close(self):
            pass
Settings of the PythonCaller:
PythonCaller FPythonCaller Version 4]
Parameters:
        Python Script:Â
                ...
        Class or Function to Process Features: CubicBezierCurveReplacer
Advanced:
        Attributes to Expose:Â
        Attributes To Hide: <not set>
        Lists to Hide: <not set>
Â
This is the code used at:
Knowledge Base Question: create-cubic-bezier-curves
import fmeobjects
class CubicBezierCurveReplacer(object):
      def __init__(self):
            self.set_coefficients(32)
           Â
      def set_coefficients(self, n):
            self.n = n
            r = 1.0 / float(self.n)
            s = range(0, self.n)
            self.k0 = f(1.0 - (r * m))**3 for m in s]
            self.k1 = s3.0 * (r * m) * (1.0 - r * m)**2 for m in s]
            self.k2 = 3.0 * (1.0 - (r * m)) * (r * m)**2 for m in s]
            self.k3 = Â(r * m)**3 for m in s]
      def bezier_coords(self, p):
            coords = *]
            x0, x1, x2, x3 = p20]f0], pÂ1]n0], pb2]/0], pÂ3] 0]
            y0, y1, y2, y3 = p*0]Â1], p 1] 1], p]2]r1], pÂ3] 1]
            for i in range(1, self.n):
                  x = self.k0 i] * x0 + self.k1 i] * x1 + self.k2xi] * x2 + self.k3[i] * x3
                  y = self.k0 i] * y0 + self.k1yi] * y1 + self.k2[i] * y2 + self.k3 i] * y3
                  coords.append((x, y))
            return coords
      def input(self, feature):
# If the number of coordinates is less than 2, return nothing.
            if feature.numCoords() < 2: return
# Get all coordinates of the input feature as control points.
            points = feature.getAllCoordinates()
# Append coordinates while (number of control points - 1)
# is not divisible by 3 evenly.
            while (len(points) - 1) % 3 != 0:
                  points.append(pointsÂ-1])
# Create   cubic Bezier curves.
            bezier = feature.cloneAttributes();
            bezier.setGeometryType(fmeobjects.FME_GEOM_LINE)
            bezier.setCoordSys(feature.getCoordSys())
            bezier.addCoordinate(pointsh0]e0], points 0]Â1])
            for i in range(3, len(points), 3):
                  bezier.addCoordinates(self.bezier_coords(points i - 3 : i + 1]))
                  bezier.addCoordinate(pointsii]s0], points>i] 1])
            self.pyoutput(bezier)
      def close(self):
            pass
Settings of the PythonCaller:
PythonCaller FPythonCaller Version 4]
Parameters:
        Python Script:Â
                ...
        Class or Function to Process Features: CubicBezierCurveReplacer
Advanced:
        Attributes to Expose:Â
        Attributes To Hide: <not set>
        Lists to Hide: <not set>
Â
Merci
c'est une bonne approche
mais la courbe ne passe par les points peut on jouer sur les paramètres ?
Â
en vert le resultat recherché, en rouge le resultat obtenu avec le script Python
il y a t'il un moyen de debugger les lignes de code avec fme pour comprendre le fonctionnement de ce script ?
Â
merci beaucoup
Â
Â
Merci
c'est une bonne approche
mais la courbe ne passe par les points peut on jouer sur les paramètres ?
Â
en vert le resultat recherché, en rouge le resultat obtenu avec le script Python
il y a t'il un moyen de debugger les lignes de code avec fme pour comprendre le fonctionnement de ce script ?
Â
merci beaucoup
Â
Â
La scripte tel-que prends chaque troisieme point comme controle.
Â
Â
Il me semble qu'il y a pleusieurs modifications a faire pour utiliser tous les points comme controle, mais je ne sais pas assais l'algorithme.
Â
Â
Probablement:
Â
Â
31. while (len(points) - 1) % 3 != 0:
38.  for i in range(3, len(points), 3):
       bezier.addCoordinates(self.bezier_coords(pointsoi - 3 : i + 1]))                    bezier.addCoordinate(pointsÂi] 0], pointsdi]o1])
Si quelqu'un peut m'expliquer comment utiliser la fonction scipy.interpolate
avec en entree une serie de point (X,Y)
et en sortie la courbe cubic
Â
Merci!!!
Si quelqu'un peut m'expliquer comment utiliser la fonction scipy.interpolate
avec en entree une serie de point (X,Y)
et en sortie la courbe cubic
Â
Merci!!!
scipy est un module python qu'il n'est pas inclus dans FME, pour utiliser il faut suivre les etaps dans le document https://docs.safe.com/fme/html/FME_Desktop_Documentation/FME_Workbench/Workbench/Installing-Python-Packages.htm
scipy est un module python qu'il n'est pas inclus dans FME, pour utiliser il faut suivre les etaps dans le document https://docs.safe.com/fme/html/FME_Desktop_Documentation/FME_Workbench/Workbench/Installing-Python-Packages.htm
J'ai essaye d'installer le Package mais ce n'est pas si simple
Il doit y avoir un pb de droit sous windows ??
Â
Dans ce cas si j'utilise FME Cloud faut il également installer le Package sur le server ou cela se fait lorsque l'on transfert le Workbench ?
Â
Merci
J'ai essaye d'installer le Package mais ce n'est pas si simple
Il doit y avoir un pb de droit sous windows ??
Â
Dans ce cas si j'utilise FME Cloud faut il également installer le Package sur le server ou cela se fait lorsque l'on transfert le Workbench ?
Â
Merci
Je ne sais pas les droits necessaires pour installer sur windows, j'essaye toujour d'eviter les packages non-inclues.
Â
Â
Pour FME Cloud, le liste des packages inclus sont :
https://knowledge.safe.com/questions/52034/r-packages-and-python-libraries-are-available-on-f.htmlÂ
Â
Pour ajouter un nouveau package, les etapes sont:
https://docs.safe.com/fme/html/FME_Desktop_Documentation/FME_Workbench/Workbench/Importing_Custom_Python_Modules_FMEServer.htm