LA LECTURE ET LA CONVERSION DE SOURCES EPS SOIT EPS ENCAPSULÉ AU FORMAT DU LOGIC

sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 - 7 mai 2013 à 10:45
 denisbertin - 15 mai 2013 à 11:16
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/55131-la-lecture-et-la-conversion-de-sources-eps-soit-eps-encapsule-au-format-du-logiciel-denis-draw

denisbertin
15 mai 2013 à 11:16
Je vais tout de même vous dire pourquoi je ne vous envoie pas les unités dépendantes, car si je les ajoute, elles mêmes ces unités inclus d'autre modules, et cela serait très long à moins de tout vous envoyer mais ainsi je ne pourrait plus le vendre mais vous le donner ce qui serait mieux.
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
14 mai 2013 à 14:58
Pitié... Arretez le !!!!

:)
denisbertin
14 mai 2013 à 14:47
procedure box(hwindow:hwnd;message:pchar);
begin
messagebox(hwindow,message,'vincent',mb_ok);
end;
const Lecture = '301.663 298.275 mo';

{function last_car_is(aStr:pchar):boolean;
var LineLen,aStrLen:Integer; p:pchar;
begin
aStrLen := strlen(aStr);
LineLen := Length(Lecture);
if LineLen < aStrLen then
Result := False
else
begin
p:=@lecture[succ(LineLen-aStrLen)];
while aStr^<>#0 do
begin
if p^<>astr^ then
begin
result:=false;
exit;
end;
inc(astr);
inc(p);
end;
result:=true;
end;
end;}

{function last_car_is(s:string):boolean;
var i,longeur,position:integer;
longeur_verifier:integer;
resultat:boolean;
begin
resultat:=true;
longeur_verifier:=length(s);
longeur:=length(lecture);
if longeur<longeur_verifier then begin last_car_is:=false; exit end;
for i:=1 to longeur_verifier do
begin
position:=longeur-longeur_verifier+i;
if lecture[position]<>s[i] then
resultat:=false;
end;
last_car_is:=resultat;
end;}

function last_car_is(const aStr:string):boolean;
var LineLen, aStrLen: Integer;
begin
Result := False;
aStrLen := Length(aStr);
LineLen := Length(Lecture);
if LineLen < aStrLen then
Exit; Result :aStr PChar(@Lecture[LineLen - aStrLen + 1]);
end;

procedure TDisque_window.Occupation_du_processeur;
var i,time:integer;
begin
time:=gettickcount;
for i:=0 to 10000000 do
begin
last_car_is(' mo');
end;
box(self.hwindow,pchar(inttostr(gettickcount-time)));
end;
denisbertin
14 mai 2013 à 14:33
const Lecture = '301.663 298.275 mo';

procedure box(hwindow:hwnd;message:pchar);
begin
messagebox(hwindow,message,'vincent',mb_ok);
end;

{function last_car_is(aStr:pchar):boolean;
var LineLen,aStrLen:Integer; p:pchar;
begin
aStrLen := strlen(aStr);
LineLen := Length(Lecture);
if LineLen < aStrLen then
Result := False
else
begin
p:=@lecture[succ(LineLen-aStrLen)];
while aStr^<>#0 do
begin
if p^<>astr^ then
begin
result:=false;
exit;
end;
inc(astr);
inc(p);
end;
result:=true;
end;
end;}

{function last_car_is(s:string):boolean;
var i,longeur,position:integer;
longeur_verifier:integer;
resultat:boolean;
begin
resultat:=true;
longeur_verifier:=length(s);
longeur:=length(lecture);
if longeur<longeur_verifier then begin last_car_is:=false; exit end;
for i:=1 to longeur_verifier do
begin
position:=longeur-longeur_verifier+i;
if lecture[position]<>s[i] then
resultat:=false;
end;
last_car_is:=resultat;
end;}

function last_car_is(const aStr:string):boolean;
var LineLen, aStrLen: Integer;
begin
Result := False;
aStrLen := Length(aStr);
LineLen := Length(Lecture);
if LineLen < aStrLen then
Exit; Result :aStr PChar(@Lecture[LineLen - aStrLen + 1]);
end;

procedure TDisque_window.Occupation_du_processeur;
var i,time:integer;
begin
time:=gettickcount;
for i:=0 to 10000000 do
begin
last_car_is(' mo');
end;
box(self.hwindow,pchar(inttostr(gettickcount-time)));
end;
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
14 mai 2013 à 14:24
Cirec, tu sors !

:D
denisbertin
14 mai 2013 à 14:20
D'ailleurs je viens de vérifier en executant 10000000 fois cette boucle avec la fonction de cirec le temps écoulé est de 1656 millisecondes
Avec le même processeur et ma fonction le temps imparti pour cette fonction est de 328 millisecondes.

t:=gettickcount;
for i:=0 to 10000000 do
begin
last_car_is(' mo');
end;
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
14 mai 2013 à 14:07
"persiste" si tu veux, mais ça fait presque une semaine qu'on te demande un code exploitable, avec une démo si possible, et débarrassé des références à des fichiers non disponibles (ou avec les unités concernées). On a bien compris que ce code faisait partie de ton génial logiciel denis-draw, et on sait où le télécharger.

Maintenant, si tu veux partager du code avec la communauté de DelphiFr (parce que c'est de ça qu'il s'agit ici), ce serait bien d'arrêter de se regarder un peu le nombril et de tenir compte de nos différentes remarques, parce que pour le moment, à part le fait que tu sais taper sur un clavier, tu n'as pas prouvé grand chose...
denisbertin
14 mai 2013 à 13:43
Oui je persiste, car en effet l'extrait de code suivant,
la troisième version de last_car_is, génère moins de code X86
en assembleur que les deux versions précédantes.
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
13 mai 2013 à 21:26
"...dans un logiciel de plus de 380.000 lignes de programmation"
"J'ai réécrit ce code ainsi pour te démontrer que l'on peut faire encore mieux"
Tout devient clair et lumineux :
ENCORE MIEUX = PLUS DE LIGNES DE CODE.
Vu sous cet angle...
cs_barbichette Messages postés 220 Date d'inscription lundi 30 octobre 2000 Statut Membre Dernière intervention 15 juillet 2013
13 mai 2013 à 20:23
Moi, je suis d'accord avec Denis.
Je suis très fière de moi même, et je crois que je ne le dis pas assez.
Alors, permettez moi de me mettre une médaille en programmation car, ce que je fait, c'est bien.
Et d'ailleurs, les autres on tort (voir même toujours tort)... Alors en plus d'une belle première place, je vais me lancer des fleurs...

Bref, j'arrête car j'ai trop mal au ventre à force de rigoler...

Pour info :
--> J'ai réécrit ce code ainsi pour te démontrer que l'on peut faire encore mieux.
<-- Oui, on peut toujours faire mieux, sauf toi...
je sais, c'est méchant, mais il ne me semble pas que tu mérites plus de gratitude de ma part.

Barbichette
denisbertin
13 mai 2013 à 12:55
//J'ai réécrit ce code ainsi pour te démontrer que l'on peut faire encore mieux.
function last_car_is(aStr:pchar):boolean;
var LineLen,aStrLen:Integer; p:pchar;
begin
aStrLen := strlen(aStr);
LineLen := Length(Lecture);
if LineLen < aStrLen then
Result := False
else
begin
p:=@lecture[succ(LineLen-aStrLen)];
while aStr^<>#0 do
begin
if p^<>astr^ then
begin
result:=false;
exit;
end;
inc(astr);
inc(p);
end;
result:=true;
end;
end;
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
11 mai 2013 à 17:51
"Je ne suis pas d'accord avec cirec en effet dans la procédure que tu propose tu ne vérifis que le dernier carctère or la chaine de caractère à comparaît avec une autre peut comporter un nombre indétermminé de caractères et les dernier de la chaine à comparaît avec la chaine passée en paramètre. "

Je suis partagé entre le rire et la consternation ...
tu cris partout que tu es l'auteur de DenisDraw ...
ton CV ne manque pas de piquant non plus ... du coup on s'attend à
avoir une personne qui connait bien l'informatique avec un bon niveau en programmation.

Mais voilà qu'une simple ligne de code de niveau Débutant+
te poses un problème !!!Result :aStr PChar(@Lecture[LineLen - aStrLen + 1]);
ça fait un peu tâche

si tu n'arrives pas à comprendre un bout de code en le lisant
tu pouvais au moins le tester avant, il n'y a pas de honte à ça,
ce qui t'aurais permis de remarquer qu'il
fait la même chose que le tien mais en moins de cycles

sinon, voici quelques informations puisqu'elles semblent êtres utiles:
@Lecture[LineLen - aStrLen + 1]
renvoi un pointeur (une adresse mémoire) sur le premier caractère du reste de la chaine
mais
PChar(@Lecture[LineLen - aStrLen + 1])
renvoi le reste de la chaine à partir de ce caractère

la comparaison se fait bien sur tous les caractères ! cqfd

et on attend toujours encore les dépendances
si tu ne veux pas les donner ... ok
mais c'est à toi de fournir un code sans dépendances dans ce cas
Je ne suis pas d'accord avec cirec en effet dans la procédure que tu propose tu ne vérifis que le dernier carctère or la chaine de caractère à comparaît avec une autre peut comporter un nombre indétermminé de caractères et les dernier de la chaine à comparaît avec la chaine passée en paramètre.
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
8 mai 2013 à 18:54
Comme d'habitude tu postes un code totalement inutilisable en l'état !!!

tu connais la chanson ...
même motif, même punition
si rien est fait pour rendre le code utilisable il sera supprimé!

même si on ne peut pas tester ce code, on peut néanmoins en déduire
qu'il doit être extrêmement lent vue sa construction et les méthodes employées.

Ex. AssignFile et IOResult sont d'un autre age !!!! ça date du Turbo Pascal
Il n'y a pas de bloc "try except/finally end" pour encadrer, sécuriser le code etc. etc.

la vitesse d'exécution peut être considérablement réduite ...

ainsi ta fonction ( l'usine à gaz):

function last_car_is(s:string):boolean;
var i,longeur,position:integer;
longeur_verifier:integer;
resultat:boolean;
begin
resultat:=true;
longeur_verifier:=length(s);
longeur:=length(lecture);
if longeur<longeur_verifier then begin last_car_is:=false; exit end;
for i:=1 to longeur_verifier do
begin
position:=longeur-longeur_verifier+i;
if lecture[position]<>s[i] then
resultat:=false;
end;
last_car_is:=resultat;
end;

pourrait ressembler à quelque chose comme ça:

function IsLastCar(const aStr:string):Boolean;
var
LineLen, aStrLen: Integer;
begin
Result := False;
aStrLen := Length(aStr);
LineLen := Length(Lecture);
if LineLen < aStrLen then
Exit; Result :aStr PChar(@Lecture[LineLen - aStrLen + 1]);
end;

qui, non seulement, est plus concis mais donne de meilleurs performances

voilà ... tant que les modifications ne seront pas apportées au code
c'est pas la peine d'aller plus loin.

La balle est dans ton camp
Cependant le code PDF est crypter et il faudrais aussi la clé voir d'ajouter une conversion du positionnement des Textes au format True-Type
Qui sont intégrées à denis draw avec un de ces module de positionnement puis d'attribution d'une typographie et aussi d'exploser son glyph son contour qui lui aussi correspond point à point avec mon format vectorielle qui se traduit très bien dans ce format.
En définitive un langage de description de page ne devrait avoir que deux fonction Moveto Lineto et aussi des splines d'interpolations.
Je me demande si un vrai décodeur de code forth-postscript en pascal existe ? Actuellement je suis en train d'améliorer l'import Autocad dont j'ai réécrit les classes elementaire, afin d'ajouter la lecture du format DXF qui fonctione très bien permet aussi d'alléger ou de simplifier son tracer ce matin même j'ai ajouté la lecture des éléments Ellipses. Je me demande aussi comment je pourrait exporter en PDF avec ces deux seules fonction ceci devrait être simple.
Néanmois ce code source écrit récemment il y a tout de même deux ans, me permet de vérifier que ma classe objet correspond point à point avec le format natif d'illustrator, et ainsi de faire correspondre exactement la lecture Eps avec le format que j'ai développer dans les années 1990.
Effectivement les dépendant son nombreuses, avec d'autre unité indispensable et tous ces modules sont imbriquer dans un logiciel de plus de 380.000 lignes de programmmation avec turbo-pascal-delphi-7 pour Windows. Mais vous pouvez ainsi voir une partie de l'élaboration de mon logiciel.
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
8 mai 2013 à 08:24
""Pour vous répondre col_plan.TCalque est une collection de Plan et de calque qui contient des éléments graphiques, un contenaire."
-> Ok, mais donc c'est bien ce que je dis : sans la définition de ta classe TCalque, on ne peut pas utiliser ton code.
"{Written avec le compilateur Dephi version 7 édition studio en un après-midi.}"
-> Waou ! Tu veux une médaille ?
En fait la lecture de set dash on devrait être conforme aux effets appliquer aux filets.
Il y a aussi la fonction set rect, mais un accés direct aux variable une par une revient au même que d'utiliser une fonction qui elle même occupe plus de cycle du microprocesseur.
Lecture d'un ficher postscript et décryptage pour denis-draw, relecture par régis blanc
écrit par denis bertin le Vendredi 16-Juillet 2010 pour lire des fichier Adobe Illustrator
Copyright Beelog Version 1.0 - a mini PostScript_interpretor... do not décode as Forth langage, for gilles and is HP-41

{Ce format d'échange est généré par Adobe Illustrator ,il est reconnu dans sa version 14.}
{La lecture de ces fichiers se fait d'après le modèle de cette version obtenue sur}
{Les fichiers EPS fournis sur le Cd-rom du magazine WEB-Design numéro 20.}
{Written avec le compilateur Dephi version 7 édition studio en un après-midi.}

{So each time a form is created, draw-it, at this moment and not every screen update who need to redraw all}
{To avoid spending time after reading, ... I expect that the show will be correct for remove this invalidaterect(self.hwindow,nil,false);}

Pour vous répondre col_plan.TCalque est une collection de Plan et de calque qui contient des éléments graphiques, un contenaire.
gdipobj.TGPGraphics est un objet de Gdi+Plus.
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
7 mai 2013 à 14:42
et au lieu de :
rect_post_inserted.left:=maxint;
rect_post_inserted.top:=maxint;
rect_post_inserted.right:=-maxint;
rect_post_inserted.bottom:=-maxint;

on peut utiliser SetBounds()

:)
korgis Messages postés 420 Date d'inscription samedi 17 mai 2003 Statut Membre Dernière intervention 6 mai 2019 17
7 mai 2013 à 14:27
au lieu de :

procedure decode_dash;
begin
if lecture='[3 3 ] 0 dsh' then
begin
set_dash_on:=true;
end
else
set_dash_on:=false;
end;

on peut faire :

procedure decode_dash;
begin set_dash_on :lecture '[3 3 ] 0 dsh';
end;

Ouais, je sais, ça change pas grand chose.
Mais que dire de plus devant toutes ces lignes de code complètement inutiles...
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
7 mai 2013 à 14:06
et il me semble qu'on dit plutôt :
Si vous connaissez ce langage, saurez-vous comprendre ?
dubois77 Messages postés 675 Date d'inscription jeudi 17 avril 2008 Statut Membre Dernière intervention 19 février 2019 14
7 mai 2013 à 12:45
Bonjour
un peu (beaucoup en fait !) d'accord avec simon :
il n'y a pas de zip
il faut faire un copier coller de je ne sais quoi, je ne sais ou
les types des variables sont très hermétiques
bref, il faut un peu (beaucoup même) améliorer ce qui doit certainement très interessant
Désolé Denis
Cordialement
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
7 mai 2013 à 10:45
c'est quoi :
- col_plan.TCalque
- gdipobj.TGPGraphics
- wformes1.Tforme_dessin
- wformes.tforme
- pc1024
- pc100
- hls_rvb.CMYB_to_RGB
...

"Si vous connaissait ce langage seriez-vous comprendre ?"
-> Si tu tiens compte des remarques qu'on te fait à chaque source que tu postes, peut être qu'elles resteront sur le site un peu plus de deux jours...
-> C'est à toi de te mettre au niveau de tes interlocuteurs et non l'inverse. Je ne pense pas que ce site soit un endroit approprié pour l'autocongratulation...

Ton source est inexploitable tel quel (surtout pour un débutant puisque tu le classes dans les sources pour débutants). C'est dommage car le sujet pourrait être intéressant.
-> Poste une unité complète avec les dépendances,
-> Un exemple d'utilisation serait le bienvenu.
Rejoignez-nous