Fonctions CaR dans les scripts ?

Lieu d'échange sur les pratiques et les réalisations de scripts
Post Reply
jerome
Posts: 173
Joined: Tue Nov 06, 2007 8:20 pm
Location: Saint-Brieuc

Fonctions CaR dans les scripts ?

Post by jerome » Sun Oct 04, 2009 8:47 am

Bonjour,
Dans un script, j'aurais besoin de la distance entre deux points.

Code: Select all

distance = d("A","B");
ne fonctionne évidemment pas.

Alors pour l'instant je tape quelque chose comme :

Code: Select all

distance=Expression("d(_o,_i)",-3,-4);SetHide(distance, true);
distance=GetExpressionValue(distance);
Existe-t-il un moyen plus rapide ?

User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

Post by alain974 » Sun Oct 04, 2009 9:01 am

Si tu crées un segment, sa valeur est la distance:

Code: Select all

s=Segment("A","B");
SetHide(s,true);
p=Point("_s",0);
L'abscisse de "p" est la distance voulue.

jerome
Posts: 173
Joined: Tue Nov 06, 2007 8:20 pm
Location: Saint-Brieuc

Post by jerome » Sun Oct 04, 2009 12:34 pm

Ok, merci,
Mais d'une façon plus générale, y a-t-il un moyen de récupérer des fonctions (d() ou autres) ou constantes (par exemple pixel) de CaR dans l'éditeur de scripts ?

User avatar
yves974
Posts: 268
Joined: Tue Oct 30, 2007 3:11 am
Location: Réunion

Post by yves974 » Sun Oct 04, 2009 6:53 pm

Pour d c'est comme pour les valeurs des curseurs, il suffit de le mettre dans une expression : dans une expression LaD, tu mets la distance dont tu as besoin et tu peux utiliser LaD dans le script ou la prendre par dist='LaD";

Cela dit pour les distances jusque là j'ai toujours utlisé un segment car on peut directement utiliser s1 (s'il s'appelle comme ça) dans les commandes entre guillements, c'est pratique aussi.

Par contre pour pixel, moi non plus je n'ai pas d'idée.

stephrey
Posts: 16
Joined: Thu Jan 20, 2011 3:51 pm
Location: Limoges

Post by stephrey » Fri Jan 21, 2011 12:10 pm

Bonjour,

Je propose l'ajout d'une fonctionnalité à Carmetal version 3.5.2 (c'est la seul version pour laquelle je dispose du code source).
Il s'agit de donner l'accès au ZirkelCanvas de la figure. Pour ce faire, modifions le fichier src/eric/JSprogram/JSRun.java pour ajouter la méthode Zir à la classe JSRun.On n'oubliera pas d'ajouter la chaine "Zir" au tableau allnames.

Code: Select all

public class JSRun {
    static Context cx = null;
    static ScriptableObject scope = null;
    static Construction C = null;
    static ZirkelCanvas ZC = null;
    static String CTOOL = "";
    static String CBACKUP = "";
    static String FILENAME = "";
    static ArrayList<String> BACKUPS = new ArrayList<String>();
    static String[] allnames = {"cm",  ... , "Layer",  "Zir"}; 
    // 
    //
    //
    static public ZirkelCanvas Zir() {
       return ZC;
    }
}
Après compilation de cette version modifiée, on peut faire les choses suivantes dans un CarScript :

Code: Select all

// On suppose que A et B sont des points de la figure

pixel = Number(Zir().JSreceive("pixel"));
Println("pixel/2 =" + (pixel/2));

distanceAB = Number(Zir().JSreceive("d(A,B)"));
Println("distanceAB = " + distanceAB);

stephrey
Posts: 16
Joined: Thu Jan 20, 2011 3:51 pm
Location: Limoges

Post by stephrey » Sun Jan 23, 2011 12:13 pm

Bonjour,

Je pensais qu'il n'était pas possible d'accéder au ZirkelCanvas de la figure sans rajouter une méthode à la classe JSRun.
Eh bien en relisant le code source de CaRMetal 3.5.2 (Pas dans son intégralité, je vous rassure !), je viens de m'apercevoir que j'avais tort et qu'il n'est donc pas nécessaire de modifier CaRMetal.

Code: Select all

ZC = Packages.eric.JZirkelCanvas.getCurrentZC();

a = InteractiveInput("Point A","Point");
b = InteractiveInput("Point B","Point");

pixel = Number(ZC.JSreceive("pixel"));
Println("pixel =" + pixel);

distance = Number(ZC.JSreceive("d("+a+","+b+")"));
Println("d("+a+", "+b+") = " + distance); 
J'espère que ceci répondra à la question de Jérome :
Mais d'une façon plus générale, y a-t-il un moyen de récupérer des fonctions (d() ou autres) ou constantes (par exemple pixel) de CaR dans l'éditeur de scripts ?

jerome
Posts: 173
Joined: Tue Nov 06, 2007 8:20 pm
Location: Saint-Brieuc

Post by jerome » Sun Jan 23, 2011 1:57 pm

Très intéressant.
Merci.

User avatar
alain974
Posts: 150
Joined: Sat Jun 13, 2009 9:08 am
Location: Réunion

Post by alain974 » Sun Mar 04, 2012 5:26 pm

jerome wrote:y a-t-il un moyen de récupérer des fonctions (d() ou autres) ou constantes (par exemple pixel) de CaR dans l'éditeur de scripts ?
Au bout de plus de deux ans après la question, je viens de trouver un élément de réponse :oops:

En supposant qu'on a tracé une fonction f1 dans la figure, on peut créer un miroir de f1 avec ce script

Code: Select all

figure=getC();
fonction=figure.find("f1");

function f1(x){
    return fonction.evaluateF(x);
}
On peut aussi redéfinir l'intervalle de définition de f1 avec

Code: Select all

fonction.setRange(-5,5,0.1)
Une fois que c'est fait, on peut alors calculer l'intégrale de la fonction sur ce nouvel intervalle, avec


Code: Select all

Println(fonction.getIntegral());
Ceci dit, cette dernière "fioriture" est inutile puisqu'on peut créer une expression donnant l'intégrale:

Code: Select all

var e=Expression("integrate(f1,-5,5)",0,0);
Println(GetExpressionValue(e));

jerome
Posts: 173
Joined: Tue Nov 06, 2007 8:20 pm
Location: Saint-Brieuc

Post by jerome » Mon Mar 05, 2012 9:06 am

Merci.

User avatar
Dibs
Posts: 112
Joined: Tue Apr 24, 2012 2:15 am
Location: Pau

Re: Fonctions CaR dans les scripts ?

Post by Dibs » Wed Apr 30, 2014 4:37 pm

Plus de 5 ans plus tard (...), je redécouvre ce topic vraiment très intéressant. Merci à vous.

Avec la seule présence de X,Y, et GetExpressionValue, je trouve qu'il y a un déséquilibre dans la syntaxe.
D'où cette question naïve : serait-il possible d'implémenter (sur le modèle de ce que propose stephrey) une espèce de CaRScript Eval universel (qui s'appliquerait aussi au rayon d'un cercle et à l'aire d'un polygone) ?

A propos, je cherche l'équivalent de cette passerelle dans DGPad.
Selon moi, cette passerelle doit exister, et je ne la trouve pas...

Post Reply