home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d09xx / d0925.lha / DonsGenies / FrenchGenies.lha / Rexx / BorduresG駮m騁riques.pprx < prev    next >
Text File  |  1993-08-03  |  28KB  |  852 lines

  1. /*@BBorduresGΘomΘtriques @P @I Ecrit par et ⌐ Don Cox en juillet 92
  2. @IBugs corrigΘs en Janvier 1993. N'est pas du Domaine Publique.
  3. @ITous Droits RΘservΘs.
  4.  
  5. Traduit par Fabien Larini le 17/07/93.
  6.  
  7. Ce GΘnie met une bordure autours d'une boεte, en utilisant des donnΘes
  8. qu'il stocke, et ajuste les marges en consΘquence. La bordure rΘsultante
  9. est une boεte simple superposΘe α la boεte encadrΘe. La couleur de trait,
  10. de remplissage, le motif de trait et de remplissage courant sont
  11. utilisΘs.
  12. */                     
  13.  
  14.  
  15. /* BorderSimpleShapes*/
  16. /* This Genie puts a decorative border around a box, using data stored in the genie. The resulting border is merged into a single box. The current line and fill colours are used. 
  17. Genie written and ⌐ by Don Cox   July 92. Bug fixes Jan 93. Not public domain.  All rights reserved. */
  18.  
  19.  
  20. trace n
  21. address command
  22. signal on error
  23. signal on syntax
  24. signal on halt
  25. signal on break_c
  26. signal on break_d
  27. signal on break_e
  28.  
  29. if ~show("l", "gdarexxsupport.library") then
  30.     if ~addlib("gdarexxsupport.library", 0, -30,0) then
  31.     do
  32.         call ppm_Inform(1,"Installez la gdarexxsupport.library dans le rΘpertoire libs: avant de lancer ce GΘnie.")
  33.     end
  34.  
  35. call ppm_AutoUpdate(0)
  36. call SafeEndEdit.rexx()
  37. cr="0a"x
  38.  
  39.  
  40. CurrentUnits = ppm_GetUnits()
  41.  
  42. select
  43.     when CurrentUnits = 1 then do
  44.         units="inches"
  45.         mul = 1
  46.         mul2 = 72
  47.         end
  48.     when CurrentUnits = 2 then do
  49.         units="mm"
  50.         mul = 10
  51.         mul2 = 28.4
  52.         end
  53.     otherwise do 
  54.         call ppm_SetUnits(2)
  55.         units="mm"
  56.         mul = 10
  57.         mul2 = 28.4
  58.         end
  59.     end
  60.  
  61. mainbox = ppm_ClickOnBox("  Clickez dans la Boεte α Encadrer")
  62. if mainbox = 0 then exit_msg("Pas de Boεte SΘlectionnΘe")
  63. mainpos = ppm_GetBoxPosition(mainbox)
  64. mainXpos = word(mainpos, 1)
  65. mainYpos = word(mainpos, 2)
  66. mainsize = ppm_GetBoxSize(mainbox)
  67. mainwidth = word(mainsize,1)
  68. mainheight = word(mainsize,2)
  69. mainangle = ppm_GetBoxAngle(mainbox)
  70.  
  71.  
  72. /* Initialize data strings  */
  73. cornerline1 = "" 
  74. cornerline2 = ""
  75. cornerline3 = ""
  76. cornerweight1 = "" 
  77. cornerweight2 = ""
  78. cornerweight3 = ""
  79. sideline1 = ""
  80. sideline2 = ""
  81. sideline3 = ""
  82. cornerXoffset = 0
  83. cornerYoffset = 0
  84. sideXoffset = 0
  85. sideYoffset = 0
  86. cornerfill1 = 0
  87. cornerfill2 = 0
  88. cornerfill3 = 0
  89. sidefill1 = 0
  90. sidefill2 = 0
  91. sidefill3 = 0
  92. lines = 1
  93.  
  94. list="Clef GrΦcque"cr"2 Cadres"cr"2 Cadres Arrondis"cr"2 Cadres Arrondis InversΘs"cr"3 Cadres"cr"CrΘneaux"cr"PointillΘs"cr"CarrΘs Remplis"cr"Doubles CarrΘs"cr"CarrΘs DΘcentrΘs"cr"Triangles Remplis"cr"Triangles Remplis 2"cr"3 CarrΘs DΘcentrΘs"cr"Barres"
  95. /*list = "Greek Key"cr"Two Rules"cr"Two Rules Rounded"cr"Two Rules Reverse Rounded"cr"Three Rules"cr"Battlements"cr"Cutout"cr"Filled Squares"cr"Double Squares"cr"Off-Centre Squares"cr"Filled Triangles"cr"Filled Triangles 2"cr"Three Ls"cr"Bars"*/
  96. chosen = ppm_SelectFromList("SΘlection Motif pour la Bordure",30,14,0,list)
  97. if chosen = "" then exit_msg("ArrΩtΘ par l'Utilisateur")
  98.  
  99. /* Data for various patterns. The numbers are lists of coordinates in the format required by the DrawPoly command.  */
  100.  
  101. select 
  102.  
  103.     when chosen = "Barres" then do
  104.         cornerline1 = "0 0"cr"3 0"cr"3 3"cr"0 3"cr"0 0"
  105.         cornerline2 = "5 0"cr"7 0"cr"7 7"cr"0 7"cr"0 5"cr"5 5"cr"5 0"
  106.         cornerline3 = "9 0"cr"11 0"cr"11 11"cr"0 11"cr"0 9"cr"9 9"cr"9 0"
  107.         sideline1 = "1 0"cr"3 0"cr"3 12"cr"1 12"cr"1 0"
  108.         sideline2 = "5 0"cr"7 0"cr"7 12"cr"5 12"cr"5 0"
  109.         sideheight = 12
  110.         sidewidth = 8
  111.         sideXoffset = 1
  112.         sideYoffset = 0
  113.         cornerheight = 12
  114.         cornerwidth = 12
  115.         cornerXoffset = 0
  116.         cornerYoffset = 0
  117.         cornerfill1 = 1
  118.         cornerfill2 = 1
  119.         cornerfill3 = 1
  120.         sidefill1 = 1
  121.         sidefill2 = 1
  122.         sidefill3 = 0
  123.         lines = 0   /* number of line weights to be set by user  */
  124.         end
  125.  
  126.     when chosen = "3 CarrΘs DΘcentrΘs" then do
  127.         cornerline1 = "0 0"cr"4 0"cr"4 4"cr"0 4"cr"0 0"
  128.         cornerline2 = "6 0"cr"9 0"cr"9 9"cr"0 9"cr"0 6"cr"6 6"cr"6 0"
  129.         sideline1 = "1 0"cr"3 0"cr"3 8"cr"11 8"cr"11 10"cr"1 10"cr"1 0"
  130.         sideline2 = "5 0"cr"7 0"cr"7 4"cr"11 4"cr"11 6"cr"5 6"cr"5 0"
  131.         sideline3 = "9 0"cr"11 0"cr"11 2"cr"9 2"cr"9 0"
  132.         sideheight = 10
  133.         sidewidth = 12
  134.         sideXoffset = 1
  135.         sideYoffset = 0
  136.         cornerheight = 10
  137.         cornerwidth = 10
  138.         cornerXoffset = 0
  139.         cornerYoffset = 0
  140.         cornerfill1 = 1
  141.         cornerfill2 = 1
  142.         sidefill1 = 1
  143.         sidefill2 = 1
  144.         sidefill3 = 1
  145.         lines = 0
  146.         end
  147.  
  148.     when chosen = "Triangles Remplis 2" then do
  149.         cornerline1 = "4.3 0"cr"4.3 4.3"cr"0 4.3"cr"4.3 0"
  150.         sideline1 = "0 0"cr"4 0"cr"0 4"cr"0 0"
  151.         sideline2 = "5 1"cr"5 5"cr"1 5"cr"5 1"
  152.         sideheight = 5
  153.         sidewidth = 6.4
  154.         sideXoffset = 0.7
  155.         sideYoffset = 0
  156.         cornerheight = 5
  157.         cornerwidth = 5
  158.         cornerXoffset = 0
  159.         cornerYoffset = 0
  160.         cornerfill1 = 1
  161.         sidefill1 = 1
  162.         sidefill2 = 1
  163.         sidefill3 = 0
  164.         lines = 0
  165.         end
  166.  
  167.     when chosen = "Triangles Remplis" then do
  168.         cornerline1 = "2.6 0"cr"2.6 2.6"cr"0 2.6"cr"2.6 0"
  169.         sideline1 = "0 0"cr"4 4"cr"0 4"cr"0 0"
  170.         sideline2 = "2 0"cr"10 0"cr"6 4"cr"2 0"
  171.         sideline3 = "12 0"cr"12 4"cr"8 4"cr"12 0"
  172.         sideheight = 4
  173.         sidewidth = 12
  174.         sideXoffset = 0
  175.         sideYoffset = 0
  176.         cornerheight = 4
  177.         cornerwidth = 4
  178.         cornerXoffset = 0
  179.         cornerYoffset = 0
  180.         cornerfill1 = 1
  181.         sidefill1 = 1
  182.         sidefill2 = 1
  183.         sidefill3 = 1
  184.         lines = 0
  185.         end
  186.  
  187.     when chosen = "CarrΘs DΘcentrΘs" then do
  188.         cornerline1 = "0 0"cr"4 0"cr"4 4"cr"0 4"cr"0 0"
  189.         cornerline2 = "0 0"cr"2 0"cr"2 2"cr"0 2"cr"0 0"
  190.         sideline1 = "1 0"cr"5 0"cr"5 4"cr"1 4"cr"1 0"
  191.         sideline2 = "1 0"cr"3 0"cr"3 2"cr"1 2"cr"1 0"
  192.         sideheight = 5
  193.         sidewidth = 6
  194.         sideXoffset = 1
  195.         sideYoffset = 0
  196.         cornerheight = 5
  197.         cornerwidth = 5
  198.         cornerXoffset = 0
  199.         cornerYoffset = 0
  200.         cornerfill1 = 0
  201.         sidefill1 = 0
  202.         lines = 1
  203.         end
  204.  
  205.     when chosen = "Doubles CarrΘs" then do
  206.         cornerline1 = "0 0"cr"4 0"cr"4 4"cr"0 4"cr"0 0"
  207.         cornerline2 = "1 1"cr"3 1"cr"3 3"cr"1 3"cr"1 1"
  208.         sideline1 = "1 0"cr"5 0"cr"5 4"cr"1 4"cr"1 0"
  209.         sideline2 = "2 1"cr"4 1"cr"4 3"cr"2 3"cr"2 1"
  210.         sideheight = 5
  211.         sidewidth = 6
  212.         sideXoffset = 1
  213.         sideYoffset = 0
  214.         cornerheight = 5
  215.         cornerwidth = 5
  216.         cornerXoffset = 0
  217.         cornerYoffset = 0
  218.         cornerfill1 = 0
  219.         sidefill1 = 0
  220.         lines = 1
  221.         end
  222.  
  223.     when chosen = "CarrΘs Remplis" then do
  224.         cornerline1 = "0 0"cr"4 0"cr"4 4"cr"0 4"cr"0 0"
  225.         sideline1 = "1 0"cr"5 0"cr"5 4"cr"1 4"cr"1 0"
  226.         sideheight = 5
  227.         sidewidth = 6
  228.         sideXoffset = 1
  229.         sideYoffset = 0
  230.         cornerheight = 5
  231.         cornerwidth = 5
  232.         cornerXoffset = 0
  233.         cornerYoffset = 0
  234.         cornerfill1 = 1
  235.         sidefill1 = 1
  236.         lines = 0
  237.         end
  238.  
  239.     when chosen = "PointillΘs" then do
  240.         cornerline1 = "0 1"cr"0 0"cr"1 0"
  241.         sideline1 = "0 0"cr"1 0"
  242.         sideline2 = "3 0"cr"4 0"
  243.         sideheight = 1
  244.         sidewidth = 4
  245.         sideXoffset = 0
  246.         sideYoffset = 0
  247.         cornerheight = 1
  248.         cornerwidth = 1
  249.         cornerXoffset = 0
  250.         cornerYoffset = 0
  251.         lines = 1
  252.         end
  253.  
  254.     when chosen = "CrΘneaux" then do
  255.         cornerline1 = "0 0"cr"3.3 0"cr"3.3 2.3"cr"2.3 2.3"cr"2.3 3.3"cr"0 3.3"cr"0 0"
  256.         sideline1 = "0 6"cr"1 6"cr"1 0"cr"3 0"cr"3 6"cr"4 6"
  257.         sideheight = 6
  258.         sidewidth = 4
  259.         sideXoffset = 0
  260.         sideYoffset = 0
  261.         cornerheight = 4
  262.         cornerwidth = 4
  263.         cornerXoffset = 0
  264.         cornerYoffset = 0
  265.         lines = 1
  266.         end
  267.  
  268.     when chosen = "Clef GrΦcque" then do
  269.         sideline1 = "0 0"cr"6 0"cr"6 5"cr"3 5"cr"3 3"cr"2 3"cr"2 6"cr"7 6"cr"7 0"cr"8 0"
  270.         sideline2 = "0 1"cr"5 1"cr"5 4"cr"4 4"cr"4 2"cr"1 2"cr"1 7"cr"8 7"cr"8 0.8"
  271.         sideheight = 8
  272.         sidewidth = 8
  273.         sideXoffset = 0
  274.         sideYoffset = 0
  275.         cornerheight = 8
  276.         cornerwidth = 8
  277.         cornerXoffset = 0
  278.         cornerYoffset = 0
  279.         Cornerline1 = "0 8"cr"0 0"cr"6 0"cr"6 5"cr"2 5"cr"2 2"cr"4 2"cr"4 3"cr"3 3"cr"3 4"cr"5 4"cr"5 1"cr"1 1"cr"1 6"cr"7 6"cr"7 0"cr"8 0"
  280.         Cornerline2 = "1 8"cr"1 7"cr"8 7"cr"8 0.8"
  281.         lines = 0
  282.         end
  283.  
  284.     when chosen = "2 Cadres" then do
  285.         sideline1 = ""
  286.         sideline2 = ""
  287.         Cornerline1 = ""
  288.         cornerline2 = ""
  289.         lines = 2
  290.         end
  291.  
  292.     when chosen = "2 Cadres Arrondis" | chosen = "2 Cadres Arrondis InversΘs" then do
  293.         sideline1 = ""
  294.         sideline2 = ""
  295.         Cornerline1 = ""
  296.         cornerline2 = ""
  297.         lines = 100    /* impossible number as a flag */
  298.         end
  299.  
  300.     when chosen = "3 Cadres" then do
  301.         sideline1 = ""
  302.         sideline2 = ""
  303.         Cornerline1 = ""
  304.         cornerline2 = ""
  305.         lines = 3
  306.         end
  307.  
  308.     otherwise do
  309.         cornerline1 = "" 
  310.         cornerline2 = ""
  311.         cornerline3 = ""
  312.         sideline1 = ""
  313.         sideline2 = ""
  314.         sideline3 = ""
  315.         end
  316.     end
  317.  
  318.  
  319. /* Collect line weights from user  */
  320.  
  321. if lines>3  & lines~=100 then lines = 3
  322.  
  323. select
  324.     when lines = 0 then do
  325.         form = ppm_GetForm("Dimensions Bordure",8,"Largeur Bordure ("units")")
  326.         if form = "" then exit_msg("ArrΩtΘ par l'Utilisateur")
  327.         cornerweight1 = ""
  328.         parse var form breadth 
  329.         end
  330.  
  331.     when lines = 1 then do
  332.         form = ppm_GetForm("Dimensions Bordure",8,"Largeur Bordure ("units")"cr"Larg. Ligne (points)")
  333.         if form = "" then exit_msg("ArrΩtΘ par l'Utilisateur")
  334.         parse var form breadth "0a"x cornerweight1
  335.         end
  336.  
  337.     when lines = 2 then do
  338.         form = ppm_GetForm("Dimensions Bordure",8,"Largeur Bordure ("units")"cr"Ligne 1 (points)"cr"Ligne 2 (points)")
  339.         if form = "" then exit_msg("ArrΩtΘ par l'Utilisateur")
  340.         parse var form breadth "0a"x cornerweight1 "0a"x cornerweight2
  341.         end
  342.  
  343.     when lines = 3 then do
  344.         form = ppm_GetForm("Dimensions Bordure",8,"Largeur Bordure ("units")"cr"Ligne 1 (points)"cr"Ligne 2 (points)"cr"Ligne 3 (points)")
  345.         if form = "" then exit_msg("ArrΩtΘ par l'Utilisateur")
  346.         parse var form  breadth "0a"x cornerweight1 "0a"x cornerweight2 "0a"x cornerweight3
  347.         end
  348.  
  349.     when lines = 100 then do
  350.         form = ppm_GetForm("Dimensions Bordure",8,"Largeur Bordure ("units")"cr"Ligne 1 (points)"cr"Ligne 2 (points)"cr"Rayon coins ("units")")
  351.         if form = "" then exit_msg("ArrΩtΘ par l'Utilisateur")
  352.         parse var form  breadth "0a"x cornerweight1 "0a"x cornerweight2 "0a"x cornerRadius
  353.         if cornerRadius = "" then cornerRadius = breadth*2
  354.         end
  355.  
  356.     otherwise nop
  357.     end
  358.  
  359.  
  360. if breadth="" then exit_msg("ArrΩtΘ par l'Utilisateur")
  361. breadth = breadth/mul /* mm to cm */
  362. if breadth>(word(mainsize,1))/2 | breadth>(word(mainsize,2))/2 then exit_msg("Trop Grand")
  363.  
  364. defaultweight = (breadth*mul2)/20
  365. if cornerweight1 = "" then cornerweight1 = defaultweight
  366. if cornerweight2 = "" then cornerweight2 = defaultweight
  367. if cornerweight3 = "" then cornerweight3 = defaultweight
  368.  
  369. if lines = 1 | lines = 0 then do
  370.     cornerweight2 = cornerweight1
  371.     cornerweight3 = cornerweight1
  372.     end
  373. if lines = 2 then cornerweight3 = cornerweight2
  374. sideweight1 = cornerweight1
  375. sideweight2 = cornerweight2
  376. sideweight3 = cornerweight3
  377. maxweight = max(cornerweight1, cornerweight2, cornerweight3)
  378. maxwt = maxweight/72  /* max. line weight in inches  */
  379. if CurrentUnits = 2 then maxwt = maxwt*2.54  /* or centimetres  */
  380.  
  381.  
  382. /* First deal with plain rectangular borders  */
  383.  
  384. if chosen = "2 Cadres" then do
  385.         call ppm_SetFillPattern(0)
  386.         call ppm_NewGroup()
  387.         call ppm_SetLineWeight(sideweight1)
  388.         rect1 = ppm_DrawRect(mainXpos, mainYpos, mainXpos+word(mainsize,1), mainYpos+word(mainsize,2))
  389.         call ppm_AddToGroup(rect1)
  390.         call ppm_SetLineWeight(sideweight2)
  391.         rect2 = ppm_DrawRect(mainXpos+breadth, mainYpos+breadth, mainXpos+word(mainsize,1)-breadth, mainYpos+word(mainsize,2)-breadth)
  392.         call ppm_AddToGroup(rect2)
  393.         borderbox = ppm_MergeGroup()
  394.         call ppm_SetBoxAngle(borderbox,mainangle)
  395.         call ppm_SetBoxPosition(borderbox,mainXpos,mainYpos)
  396. /* Set an arbitrary margin in main box  */
  397.         margin = breadth*2
  398.         call ppm_SetBoxMargins(mainbox, margin, margin, margin, margin)
  399.         exit_msg("TerminΘ")
  400.         end
  401.  
  402. if chosen = "2 Cadres Arrondis" | chosen = "2 Cadres Arrondis InversΘs" then do
  403.         rev = 0
  404.         if chosen = "2 Cadres Arrondis InversΘs" then rev = 1
  405.         call ppm_ShowStatus("  Calcul de la ligne extΘrieure ...")
  406.         call ppm_SetFillPattern(0)
  407.         call ppm_NewGroup()
  408. trace n
  409. cornerRadius = cornerRadius/mul /* convert units */
  410. cRadius = cornerRadius /* for positioning centres of arcs */
  411.  
  412. AA=6.2831853/360    /* 2pi divided by 360 */
  413. AAA=AA*3
  414. angle= 180*AA /* convert to radians  */
  415. if rev = 1 then do /* for reverse curve corners  */
  416.     angle = 90*AA
  417.     AAA=-AAA  /* anti-clockwise arcs  */
  418.     cRadius = 0
  419.     end
  420.  
  421. drawstring = mainXpos (mainYpos+cornerRadius)||"0a"x
  422.  
  423. /* Draw the outer line, using 3 degree steps to give a smooth curve */
  424.         call ppm_SetLineWeight(sideweight1)
  425.         Xcentre = mainXpos+cRadius  /* centre of corner arc  */
  426.         Ycentre = mainYpos+cRadius
  427.         do i = 1 to 30
  428.             X2=Xcentre+(cornerRadius*cos(angle))
  429.             Y2=Ycentre+(cornerRadius*sin(angle))
  430.             angle=angle+AAA
  431.             drawstring=drawstring||X2 Y2"0a"x
  432.             end
  433.         if rev = 1 then drawstring = drawstring||(mainXpos +cornerRadius) mainYpos"0a"x
  434.         drawstring = drawstring||(mainXpos +mainwidth -cornerRadius) mainYpos"0a"x
  435.         Xcentre = mainXpos+mainwidth-cRadius
  436.         Ycentre = mainYpos+cRadius
  437.         if rev = 1 then angle = angle+(60*AAA)
  438.         do i = 1 to 30
  439.             X2=Xcentre+(cornerRadius*cos(angle))
  440.             Y2=Ycentre+(cornerRadius*sin(angle))
  441.             angle=angle+AAA
  442.             drawstring=drawstring||X2 Y2"0a"x
  443.             end
  444.         if rev = 1 then drawstring = drawstring||(mainXpos +mainwidth) (mainYpos+cornerRadius)"0a"x
  445.         drawstring = drawstring||(mainXpos+mainwidth) (mainYpos+mainheight-cornerRadius)"0a"x
  446.  
  447.         Xcentre = mainXpos+mainwidth-cRadius
  448.         Ycentre = mainYpos+mainheight-cRadius
  449.         if rev = 1 then angle = angle+(60*AAA)
  450.         do i = 1 to 30
  451.             X2=Xcentre+(cornerRadius*cos(angle))
  452.             Y2=Ycentre+(cornerRadius*sin(angle))
  453.             angle=angle+AAA
  454.             drawstring=drawstring||X2 Y2"0a"x
  455.             end
  456.         if rev = 1 then drawstring = drawstring||(mainXpos +mainwidth -cornerRadius) (mainYpos+mainheight)"0a"x
  457.         drawstring = drawstring||(mainXpos+cornerRadius) (mainYpos+mainheight)"0a"x
  458.         Xcentre = mainXpos+cRadius
  459.         Ycentre = mainYpos+mainheight-cRadius
  460.         if rev = 1 then angle = angle+(60*AAA)
  461.         do i = 1 to 30
  462.             X2=Xcentre+(cornerRadius*cos(angle))
  463.             Y2=Ycentre+(cornerRadius*sin(angle))
  464.             angle=angle+AAA
  465.             drawstring=drawstring||X2 Y2"0a"x
  466.             end
  467.         if rev = 1 then drawstring = drawstring||mainXpos (mainYpos+mainheight-cornerRadius)"0a"x
  468.         drawstring = drawstring||mainXpos (mainYpos+cornerRadius)"0a"x
  469.         call ppm_SaveText("ram:arcdata",drawstring)
  470.         box = ppm_DrawPoly("ram:arcdata",boxname)
  471.         call ppm_AddToGroup(box)
  472.  
  473. trace n
  474. /* Draw the inner arc, in 3 degree steps to give a smooth curve */
  475.         call ppm_ShowStatus("  Calcul de la ligne intΘrieure ...")
  476.         call ppm_SetLineWeight(sideweight2)
  477.         cornerRadius2 = cornerRadius-breadth
  478.         if rev = 1 then do
  479.             cornerRadius2 = cornerRadius+breadth
  480.             cornerRadius = cornerRadius+breadth
  481.             a2 = sin(90*AA)/cornerRadius*breadth
  482.             a2 = atan(a2/sqrt(-a2*a2+1))
  483.             a3 = 3.1415927-(90*AA)-a2
  484.             startangle = a2
  485.             arcangle = (90*AA)-(2*startangle)
  486.             AAA = -(arcangle/30)
  487.             angle = (90*AA)-startangle
  488.             end
  489. trace n
  490. /* first corner */
  491.         drawstring = (mainXpos+breadth) (mainYpos+cornerRadius)||"0a"x
  492.         Xcentre = mainXpos+cRadius
  493.         Ycentre = mainYpos+cRadius
  494.         do i = 0 to 30
  495.             X2=Xcentre+(cornerRadius2*cos(angle))
  496.             Y2=Ycentre+(cornerRadius2*sin(angle))
  497.             angle=angle+AAA
  498.             drawstring=drawstring||X2 Y2"0a"x
  499.             end
  500.         if rev = 1 then drawstring = drawstring||(mainXpos +cornerRadius) (mainYpos+breadth)"0a"x
  501.         drawstring = drawstring||(mainXpos +mainwidth -cornerRadius) (mainYpos+breadth)"0a"x
  502.  
  503. /* second corner */
  504.         Xcentre = mainXpos+mainwidth-cRadius
  505.         Ycentre = mainYpos+cRadius
  506.         if rev = 1 then angle = (180*AA)-startangle
  507.         do i = 0 to 30
  508.             X2=Xcentre+(cornerRadius2*cos(angle))
  509.             Y2=Ycentre+(cornerRadius2*sin(angle))
  510.             angle=angle+AAA
  511.             drawstring=drawstring||X2 Y2"0a"x
  512.             end
  513.         if rev = 1 then drawstring = drawstring||(mainXpos +mainwidth -breadth) (mainYpos+cornerRadius)"0a"x
  514.         drawstring = drawstring||(mainXpos+mainwidth-breadth) (mainYpos+mainheight-cornerRadius)"0a"x
  515.  
  516. /* third corner  */
  517.         Xcentre = mainXpos+mainwidth-cRadius
  518.         Ycentre = mainYpos+mainheight-cRadius
  519.         if rev = 1 then angle = (270*AA)-startangle
  520.         do i = 0 to 30
  521.             X2=Xcentre+(cornerRadius2*cos(angle))
  522.             Y2=Ycentre+(cornerRadius2*sin(angle))
  523.             angle=angle+AAA
  524.             drawstring=drawstring||X2 Y2"0a"x
  525.             end
  526.         if rev = 1 then drawstring = drawstring||(mainXpos +mainwidth -cornerRadius) (mainYpos+mainheight-breadth)"0a"x
  527.         drawstring = drawstring||(mainXpos+cornerRadius) (mainYpos+mainheight-breadth)"0a"x
  528.  
  529. /* fourth corner  */
  530.         Xcentre = mainXpos+cRadius
  531.         Ycentre = mainYpos+mainheight-cRadius
  532.         if rev = 1 then angle = 0-startangle
  533.         do i = 0 to 30
  534.             X2=Xcentre+(cornerRadius2*cos(angle))
  535.             Y2=Ycentre+(cornerRadius2*sin(angle))
  536.             angle=angle+AAA
  537.             drawstring=drawstring||X2 Y2"0a"x
  538.             end
  539.         if rev = 1 then drawstring = drawstring||(mainXpos +breadth) (mainYpos+mainheight-cornerRadius)"0a"x
  540.         drawstring = drawstring||(mainXpos+breadth) (mainYpos+cornerRadius)"0a"x
  541.         call ppm_SaveText("ram:arcdata2",drawstring)
  542.         box = ppm_DrawPoly("ram:arcdata2",boxname)
  543.         call ppm_AddToGroup(box)
  544.         borderbox = ppm_MergeGroup()
  545.         call ppm_SetBoxAngle(borderbox,mainangle)
  546.         call ppm_SetBoxPosition(borderbox,mainXpos-((sideweight1/2)/mul2), mainYpos-((sideweight1/2)/mul2))  
  547.  
  548.  
  549. /* Set an arbitrary margin in main box  */
  550.         margin = cornerRadius*1.2
  551.         call ppm_SetBoxMargins(mainbox, margin, margin, margin, margin)
  552.         exit_msg()
  553.         end
  554.  
  555.  
  556. if chosen = "3 Cadres" then do
  557.         call ppm_NewGroup()
  558.         call ppm_SetLineWeight(sideweight1)
  559.         call ppm_SetFillPattern(0)
  560.         rect1 = ppm_DrawRect(mainXpos, mainYpos, mainXpos+word(mainsize,1), mainYpos+word(mainsize,2))
  561.         call ppm_AddToGroup(rect1)
  562.         call ppm_SetLineWeight(sideweight2)
  563.         rect2 = ppm_DrawRect(mainXpos+(breadth/3), mainYpos+(breadth/3), mainXpos+word(mainsize,1)-(breadth/3), mainYpos+word(mainsize,2)-(breadth/3))
  564.         call ppm_AddToGroup(rect2)
  565.         call ppm_SetLineWeight(sideweight3)
  566.         rect3 = ppm_DrawRect(mainXpos+breadth, mainYpos+breadth, mainXpos+word(mainsize,1)-breadth, mainYpos+word(mainsize,2)-breadth)
  567.         call ppm_AddToGroup(rect3)
  568.         borderbox = ppm_MergeGroup()
  569.         call ppm_SetBoxAngle(borderbox,mainangle)
  570.         call ppm_SetBoxPosition(borderbox,mainXpos,mainYpos)
  571. /* Set an arbitrary margin in main box  */
  572.         margin = breadth*2
  573.         call ppm_SetBoxMargins(mainbox, margin, margin, margin, margin)
  574.         exit_msg("TerminΘ")
  575.         end
  576.  
  577.  
  578. /* Now deal with borders using shapes scaled to fit  */
  579.  
  580. mainheight = (word(mainsize, 2))-(breadth*2)
  581. mainwidth = (word(mainsize, 1))-(breadth*2)
  582.  
  583. call ppm_NewGroup()
  584. count = 0
  585.  
  586. if cornerline1 ~= "" then do
  587.     drawstring = cornerline1
  588.     call ppm_SaveText("ram:linedata",drawstring)
  589.     call ppm_SetLineWeight(cornerweight1)
  590.     call ppm_SetFillPattern(cornerfill1)
  591.     cornerbox = ppm_DrawPoly("ram:linedata")
  592.     call ppm_AddToGroup(cornerbox)
  593.     count = count+1
  594.     end
  595.  
  596. if cornerline2 ~= "" then do
  597.     drawstring = cornerline2
  598.     call ppm_SaveText("ram:linedata",drawstring)
  599.     call ppm_SetLineWeight(cornerweight2)
  600.     call ppm_SetFillPattern(cornerfill2)
  601.     cornerbox = ppm_DrawPoly("ram:linedata")
  602.     call ppm_AddToGroup(cornerbox)
  603.     count = count+1
  604.     end
  605.  
  606. if cornerline3 ~= "" then do
  607.     drawstring = cornerline3
  608.     call ppm_SaveText("ram:linedata",drawstring)
  609.     call ppm_SetLineWeight(cornerweight3)
  610.     call ppm_SetFillPattern(cornerfill3)
  611.     cornerbox = ppm_DrawPoly("ram:linedata")
  612.     call ppm_AddToGroup(cornerbox)
  613.     count = count+1
  614.     end
  615.  
  616. if count>1 then cornerbox = ppm_MergeGroup() /* Merge fails with 1 box */
  617.  
  618. if cornerbox ~=0 then do
  619.     if cornerheight~=0 & cornerwidth~=0 then call ppm_SetBoxSize(cornerbox, cornerwidth, cornerheight)
  620.     call ppm_SetBoxOffset(cornerbox,cornerXoffset,cornerYoffset)
  621.     csize = ppm_GetBoxSize(cornerbox)
  622.     cXsize = word(csize, 1)
  623.     cYsize = word(csize, 2)
  624.     cscale = ppm_GetBoxScale(cornerbox)
  625.     cscaleX = word(cscale, 1)
  626.     cscaleY = word(cscale, 2)
  627.     cangle = ppm_GetBoxAngle(cornerbox)
  628.     end
  629.  
  630.  
  631. call ppm_NewGroup()
  632. count = 0
  633.  
  634. if sideline1 ~= "" then do
  635.     drawstring = sideline1
  636.     call ppm_SaveText("ram:linedata",drawstring)
  637.     call ppm_SetLineWeight(sideweight1)
  638.     call ppm_SetFillPattern(sidefill1)
  639.     sidebox = ppm_DrawPoly("ram:linedata")
  640.     call ppm_AddToGroup(sidebox)
  641.     count = count+1
  642.     end
  643.  
  644. if sideline2 ~= "" then do
  645.     drawstring = sideline2
  646.     call ppm_SaveText("ram:linedata",drawstring)
  647.     call ppm_SetLineWeight(sideweight2)
  648.     call ppm_SetFillPattern(sidefill2)
  649.     sidebox = ppm_DrawPoly("ram:linedata")
  650.     call ppm_AddToGroup(sidebox)
  651.     count = count+1
  652.     end
  653.  
  654. if sideline3 ~= "" then do
  655.     drawstring = sideline3
  656.     call ppm_SaveText("ram:linedata",drawstring)
  657.     call ppm_SetLineWeight(sideweight3)
  658.     call ppm_SetFillPattern(sidefill3)
  659.     sidebox = ppm_DrawPoly("ram:linedata")
  660.     call ppm_AddToGroup(sidebox)
  661.     count = count+1
  662.     end
  663.  
  664. if count>1 then sidebox = ppm_MergeGroup()
  665.  
  666. trace n
  667. /* Place Corner Units. Setting angle before position is best for these as the basic unit is always at 0 degrees. It gives good results with boxes smaller than 2.5 mm. (Contrast BordersRepeats which has position before angle. */
  668. call ppm_NewGroup()
  669. call ppm_ShowStatus("Place les Coins")
  670. if cornerbox ~=0 then do
  671.     bbreadth = breadth*2
  672.     cbox = ppm_CloneBox(cornerbox, 0, 0)
  673.     call ppm_AddToGroup(cbox)
  674.     call ppm_SetBoxAngle(cbox,0)
  675.     call ppm_SetBoxSize(cbox, breadth, breadth)
  676.     call ppm_SetBoxScale(cbox, cscaleX*breadth/cXsize, cscaleY*breadth/cYsize)
  677.  
  678.     cbox2 = ppm_CloneBox(cbox, 0, 0)
  679.     call ppm_AddToGroup(cbox2)
  680.     call ppm_SetBoxAngle(cbox2, 90)
  681.     call ppm_SetBoxPosition(cbox2, mainXpos, mainYpos+mainheight +bbreadth)
  682.  
  683.     cbox3 = ppm_CloneBox(cbox, 0, 0)
  684.     call ppm_AddToGroup(cbox3)
  685.     call ppm_SetBoxAngle(cbox3, 180)
  686.     call ppm_SetBoxPosition(cbox3, mainXpos+mainwidth+bbreadth, mainYpos+mainheight+bbreadth)
  687.  
  688.     cbox4 = ppm_CloneBox(cbox, 0, 0)
  689.     call ppm_AddToGroup(cbox4)
  690.     call ppm_SetBoxAngle(cbox4, 270)
  691.     call ppm_SetBoxPosition(cbox4, mainXpos+mainwidth+bbreadth, mainYpos)
  692.  
  693.     call ppm_SetBoxAngle(cbox, cangle)
  694.     call ppm_SetBoxPosition(cbox, mainXpos, mainYpos)
  695.     end
  696.  
  697. trace n
  698.  
  699. if sidebox = 0 then exit_msg("TerminΘ")
  700.  
  701.  
  702. /* Collect original size and graphic scale of box */
  703.     if sideheight~=0 & sidewidth~=0 then call ppm_SetBoxSize(sidebox, sidewidth, sideheight)
  704.     call ppm_SetBoxOffset(sidebox,sideXoffset,sideYoffset)
  705.     scaleX = word(ppm_GetBoxScale(sidebox), 1)
  706.     scaleY = word(ppm_GetBoxScale(sidebox), 2)
  707.     width = word(ppm_GetBoxSize(sidebox), 1)
  708.     height = word(ppm_GetBoxSize(sidebox), 2)
  709.     scale1 = breadth/height
  710.     width2 = width*scale1
  711. totalwidth = width2
  712.  
  713.  
  714. heightcount = mainheight%totalwidth /* Use integer division to get number of repeats */
  715. widthcount = mainwidth%totalwidth
  716. if widthcount = 0 | heightcount = 0 then do
  717.     gone = ppm_DeleteBox(sidebox)
  718.     gone = ppm_DeleteBox(cornerbox)
  719.     gone = ppm_DeleteBox(cbox)
  720.     gone = ppm_DeleteBox(cbox2)
  721.     gone = ppm_DeleteBox(cbox3)
  722.     gone = ppm_DeleteBox(cbox4)
  723.     exit_msg("Motif trop Grand")
  724.     end
  725.  
  726. Xtotalwidth = mainwidth/widthcount  /* Exact width of whole pattern */
  727. Ytotalwidth = mainheight/heightcount
  728. Xscale = Xtotalwidth/totalwidth
  729. Yscale = Ytotalwidth/totalwidth
  730.  
  731.  
  732. widthX = width2*Xscale
  733. widthY = width2*Yscale 
  734.  
  735.  
  736. /* Place top units  */
  737.  
  738. call ppm_ShowStatus("Place la Bordure SupΘrieure")
  739. leftpos = mainXpos+breadth
  740. do j=1 to widthcount
  741.     newbox = ppm_CloneBox(sidebox, 0, 0)
  742.     call ppm_AddToGroup(newbox)
  743.     call ppm_SetBoxSize(newbox, widthX, breadth)
  744.     call ppm_SetBoxPosition(newbox, leftpos, mainYpos)
  745.     call ppm_SetBoxScale(newbox, (scaleX *scale1* Xscale), (scaleY * abs(scale1)) )
  746.     call ppm_SetBoxAngle(newbox, 0)
  747.     leftpos = leftpos+widthX
  748.     end
  749.  
  750. /* Place right side units */
  751. call ppm_ShowStatus("Place la Bordure Droite")
  752. toppos = mainYpos+breadth
  753. leftpos = mainXpos+word(mainsize, 1)
  754.  
  755. do j=1 to heightcount
  756.     newbox = ppm_CloneBox(sidebox, 0, 0)
  757.     call ppm_AddToGroup(newbox)
  758.     call ppm_SetBoxAngle(newbox, 270)
  759.     call ppm_SetBoxSize(newbox, widthY, breadth)
  760.     call ppm_SetBoxPosition(newbox, leftpos, toppos)
  761.     call ppm_SetBoxScale(newbox, (scaleX *scale1* Yscale), (scaleY * abs(scale1)) )
  762.     toppos = toppos+widthY
  763.     end
  764.  
  765.  
  766. /* Place bottom units  */
  767.  
  768. call ppm_ShowStatus("Place la Bordure InfΘrieure")
  769. leftpos = mainXpos+breadth+mainwidth
  770. toppos = mainYpos+word(mainsize, 2)
  771.  
  772. do j=1 to widthcount
  773.     newbox = ppm_CloneBox(sidebox, 0, 0)
  774.     call ppm_AddToGroup(newbox)
  775.     call ppm_SetBoxAngle(newbox, 180)
  776.     call ppm_SetBoxSize(newbox, widthX, breadth)
  777.     call ppm_SetBoxPosition(newbox, leftpos, toppos)
  778.     call ppm_SetBoxScale(newbox, (scaleX *scale1* Xscale), (scaleY * abs(scale1)) )
  779.     leftpos = leftpos-widthX
  780.     end
  781.  
  782. /* Place left side units */
  783. call ppm_ShowStatus("Place la Bordure Gauche")
  784. toppos = mainYpos+breadth+mainheight
  785. leftpos = mainXpos
  786.  
  787. do j=1 to heightcount
  788.     newbox = ppm_CloneBox(sidebox, 0, 0)
  789.     call ppm_AddToGroup(newbox)
  790.     call ppm_SetBoxAngle(newbox, 90)
  791.     call ppm_SetBoxSize(newbox, widthY, breadth)
  792.     call ppm_SetBoxPosition(newbox, leftpos, toppos)
  793.     call ppm_SetBoxScale(newbox, (scaleX *scale1* Yscale), (scaleY * abs(scale1)) )
  794.     toppos = toppos-widthY
  795.     end 
  796.  
  797. /* Merge all the units into one box  */
  798. borderbox = ppm_MergeGroup()
  799. call ppm_SetBoxAngle(borderbox,mainangle)
  800.  
  801. /* resize box slightly so that thick lines are not cropped */
  802. bsize = ppm_GetBoxSize(borderbox)
  803. bwidth = word(bsize,1)
  804. bheight = word(bsize,2)
  805. call ppm_SetBoxSize(borderbox,bwidth+(maxwt*2),bheight+(maxwt*2))
  806. call ppm_SetBoxPosition(borderbox,mainXpos-maxwt,mainYpos-maxwt)
  807. call ppm_SetBoxOffset(borderbox,maxwt,maxwt)
  808.  
  809. /* Delete the pattern boxes  */
  810.  
  811.     gone = ppm_DeleteBox(cornerbox)
  812.     gone = ppm_DeleteBox(sidebox)   
  813.  
  814. /* Set an arbitrary margin in main box  */
  815. margin = breadth*1.5
  816. boxtype = upper(word(ppm_GetBoxInfo(mainbox),1))
  817. if boxtype = "TEXTE" then margin = breadth*2
  818. call ppm_SetBoxMargins(mainbox, margin, margin, margin, margin)
  819. call ppm_BoxToFront(borderbox)
  820.  
  821. call ppm_NewGroup()
  822. call ppm_AddToGroup(mainbox)
  823. call ppm_AddToGroup(borderbox)
  824.  
  825. call exit_msg()
  826.  
  827. end
  828.  
  829. error:
  830. syntax:
  831.     do      
  832.     exit_msg("ArrΩt du GΘnie d√ α l'erreur: "errortext(rc))
  833.     end
  834.  
  835. break_d:
  836. break_e:
  837. break_c:
  838. halt:
  839. call exit_msg("ArrΩtΘ par l'Utilisateur")
  840.  
  841. exit_msg:
  842.     do
  843.     parse arg message
  844.     if message ~= "" then
  845.     call ppm_Inform(1, message,)
  846.     call ppm_ClearStatus()
  847.     call ppm_SetUnits(CurrentUnits)
  848.     call ppm_AutoUpdate(1)
  849.     exit
  850.     end
  851.  
  852.