/* Clonage d'un composant, en "augmentant sa référence"
   Version 1.00: 22 décembre 1998
   Version 1.01: 25 Février 1999 (modif appel ASKNUM)
   Version 1.02: 13 Avril 2000 (adaptation version 2.05)
$VER: 1.02 (© R.Florac, 13 avril 2000) */

options results     /* indispensable pour récupérer le résultat des macros */

signal on error     /* pour l'interception des erreurs */
signal on syntax

'FIRSTSEL'
o=result
if o=0 then do
    'MESSAGE("Sélectionnez le"+CHR(10)+"composant à recopier!")'
    exit
end

type=0
do while type=0
    'TYPE('o')'
    select
	when result=1 then do
	    type=1
	    leave
	end
	when result=4 then do
	    type=4
	    leave
	end
	when result=11 then do
	    type=11
	    leave
	end
	when result=12 then do
	    type=12
	    leave
	end
	otherwise nop
    end
    'NEXTSEL('o')'; o=result
    if o=0 then do
	'MESSAGE("Sélection incorrecte")'
	exit
    end
end

if type=1 then 'READTEXT(GETREF('o'))'
else 'READTEXT('o')'
ref=result
j=numero_reference(ref)
ref=reference(ref)
'WIDTH(0)'; l=(result%10)*10
'HEIGHT(0)'; h=(result%10)*10
'COL(0)'; x0=result
'LINE(0)'; y0=result
'SELECT("Sens de la copie"+CHR(10)+"Vers le bas"+CHR(10)+"Vers la droite"+CHR(10)+"Vers le haut"+CHR(10)+"Vers la gauche")'
sens=result
if sens < 1 then exit
'ASKNUM("Combien de fois"+CHR(10)+"voulez-vous effectuer"+CHR(10)+"l''opération?",2)'
n=result
if n<1 then exit
'SELECT("Pas entre les copies"+CHR(10)+"10 pixels"+CHR(10)+"20 pixels"+CHR(10)+"30 pixels"+CHR(10)+"Automatique"+CHR(10)+"Spécifié")'
pas = result
select
    when pas=1 then pas=0
    when pas=2 then pas=10
    when pas=3 then pas=20
    when pas=4 then do
	if sens=1 | sens=3 then pas=h
	else pas=l
    end
    when pas=5 then do
	'ASKNUM("Pas entre les copies",10)'
	pas=result
    end
    otherwise exit
end

'COPY(5):SAVEALL'           /* sauvegarde des éléments à copier */
do i=1 to n
    select
	when sens=1 then do	/* Copie vers le bas */
	    yy=y0+(10+pas)*i
	    yy=(yy%10)*10
	    'PASTE(5,'x0','yy')'
	end
	when sens=2 then do
	    xx=x0+(10+pas)*i
	    xx=(xx%10)*10
	    'PASTE(5,'xx','y0')'
	end
	when sens=3 then do
	    yy=y0-(10+pas)*i
	    yy=(yy%10)*10
	    'PASTE(5,'x0','yy')'
	end
	otherwise do
	    'MESSAGE("Pas encore implémenté!")'
	end
    end
    if ref ~= "" then do
	j=j+1
	k=indice(type)
	if type=1 then 'SETREF('k',"'ref||j'"):UNMARK(-1)'
	else 'SETTEXT('k',"'ref||j'"):UNMARK(-1)'
    end
end

exit

indice: procedure
    parse arg type
    'FIRSTSEL'
    o=result
    do while o>0
	'TYPE('o')'
	select
	    when result=type then return o
	    otherwise nop
	end
	'NEXTSEL('o')'; o=result
    end
    return 0

reference: procedure
    parse arg ref
    i=length(ref)
    do while i>1
	c=substr(ref,i,1)
	if datatype(c)=NUM then ref=left(ref,i-1)
	else return ref
	i=i-1
    end
    return ref

numero_reference: procedure
    parse arg ref
    i=length(ref)
    r=0
    rang=1
    do while i>1
	c=substr(ref,i,1)
	if datatype(c)=NUM then do
	    r=r+c*rang
	    rang=rang*10
	end
	else return r
	i=i-1
    end
    return r

/* Traitement des erreurs, interruption du programme */
syntax:
erreur=RC
'MESSAGE("Script Recopier.AmiCAD"+CHR(10)+"Erreur de syntaxe"+CHR(10)+"en ligne 'SIGL'"+CHR(10)+"'errortext(erreur)'")'
exit

error:
'MESSAGE("Script Recopier.AmiCAD"+CHR(10)+"Erreur en ligne 'SIGL'")'
exit
