0023510: Integration of test grid "vis" into the new testing system
[occt.git] / src / PlotMgt / PlotMgt_Plotter.cxx
1 // Created by: DCB
2 // Copyright (c) 1998-1999 Matra Datavision
3 // Copyright (c) 1999-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20 // Contains Load()/Save() and all concerned methods
21
22 #define BUC60766        //GG_140699/041000
23 //              Enable to use Direct drivers when required 
24 //              using or not the plotter parameters definition
25 //              sets by DIRPLOT symbol for compatibillty only.
26
27 #define TRACE            0
28 #define MAX_LINE_LEN  1024
29
30 #include <PlotMgt.hxx>
31 #include <PlotMgt_Plotter.ixx>
32 #include <PlotMgt_PlotterParameter.hxx>
33 #include <PlotMgt_PlotterDefinitionError.hxx>
34 #include <PlotMgt_PlotterTools.hxx>
35 #include <OSD_Environment.hxx>
36 #include <OSD_Path.hxx>
37 #include <OSD_File.hxx>
38 #include <OSD_OpenMode.hxx>
39 #include <OSD_Protection.hxx>
40
41 //=============== Static definitions ====================
42 static OSD_Environment& _DIRPLOT() {
43   static OSD_Environment DIRPLOT("DIRPLOT");
44   return DIRPLOT;
45 }
46 #define DIRPLOT _DIRPLOT()
47
48 static OSD_Environment& _DIRPARPLO() {
49   static OSD_Environment DIRPARPLO("DIRPARPLO");
50   return DIRPARPLO;
51 }
52 #define DIRPARPLO _DIRPARPLO()
53
54 #define INIT_VALUES()               \
55   myConfigVer          = "";        \
56   myModel              = "";        \
57   myTitle              = "";        \
58   myExtension          = "";        \
59   myBeforeCommand      = "";        \
60   myAfterCommand       = "";        \
61   myPrintCommand       = "";        \
62   myComments           = "";        \
63   myBackDraw           = "";        \
64   myColorMapping       = "";        \
65   myOutputFormat       = "";        \
66   myDriverType         = "";        \
67   myListOfPaperFormats.Nullify ();  \
68   myListOfOrigins.Nullify ();       \
69   myListOfQualities.Nullify ();     \
70   myListOfImageFormats.Nullify ();  \
71   myListOfColorMappings.Nullify (); \
72   myListOfOutputFormats.Nullify (); \
73   myListOfDriverTypes.Nullify ();   \
74   myPenColorIndex.Nullify ();       \
75   myPenWidthIndex.Nullify ();       \
76   myPenTypeIndex.Nullify ();        \
77   myColorMap.Nullify();             \
78   myWidthMap.Nullify();             \
79   myTypeMap.Nullify();              \
80   myFontMap.Nullify();              \
81   myAllFonts.Nullify();
82
83 #define RAISE_FILE_EXIST_ERROR(fExist,aName)                           \
84 if (!(fExist)) {                                                       \
85   anErrorString  = "PlotMgt_Plotter::PlotMgt_Plotter ERROR => File '"; \
86   anErrorString += aName;                                              \
87   anErrorString += "' not found in DIRPLOT='";                         \
88   anErrorString += DIRPLOT.Value ();                                   \
89   anErrorString += "' and in DIRPARPLO='";                             \
90   anErrorString += DIRPARPLO.Value ();                                 \
91   anErrorString += "'.";                                               \
92   cout << anErrorString.ToCString() << endl;                            \
93 }
94 //GG  PlotMgt_PlotterDefinitionError::Raise (anErrorString.ToCString()); 
95
96 #define STRING_TRIM(aString) \
97   aString.LeftAdjust();      \
98   aString.RightAdjust();
99
100 static TCollection_AsciiString aReturnValue;
101 static TCollection_AsciiString anEmptyString;
102 static TCollection_AsciiString anErrorString;
103
104 //==============================================================================
105 static Standard_Boolean FILE_EXISTS (const TCollection_AsciiString& aName,
106                               Standard_CString anExt,
107                               TCollection_AsciiString& aFullName)
108 {
109   OSD_Path aFullPath;
110   OSD_File aFile1 = OSD_File ( OSD_Path ( DIRPLOT.Value()   + "/" + aName + anExt ) );
111   OSD_File aFile2 = OSD_File ( OSD_Path ( DIRPARPLO.Value() + "/" + aName + anExt ) );
112   if (aFile1.Exists ()) {
113     aFile1.Path (aFullPath);
114     aFullPath.SystemName (aFullName);
115     return Standard_True;
116   }
117   if (aFile2.Exists ()) {
118     aFile2.Path (aFullPath);
119     aFullPath.SystemName (aFullName);
120     return Standard_True;
121   }
122   aFullName = "";
123   return Standard_False;
124 }
125
126 //==============================================================================
127 // PlotMgt_Plotter::PlotMgt_Plotter
128 //==============================================================================
129 PlotMgt_Plotter::PlotMgt_Plotter (const TCollection_AsciiString& theName,
130                                   const Standard_Boolean fDirectDevice)
131 {
132   TCollection_AsciiString aName = theName, aModel = "NEW_MODEL";
133   aName.UpperCase ();
134   aModel.UpperCase ();
135 #ifdef BUC60766
136   myDirectDevice = fDirectDevice;
137 #else
138 #ifndef WNT
139   myDirectDevice = Standard_False;
140 #else
141   myDirectDevice = fDirectDevice;
142 #endif
143 #endif //BUC60766
144   myName      = aName;
145   myModelName = aModel;
146 #ifndef BUC60766
147   if (!myDirectDevice) 
148 #endif
149   {
150     Standard_Boolean isModelExists = FILE_EXISTS(myModelName,".pmc",myModelSystemName);
151     Standard_Boolean isFileExists  = FILE_EXISTS(myName,".plc",mySystemName) ||
152                                      FILE_EXISTS(myName,".plc_off",mySystemName);
153     RAISE_FILE_EXIST_ERROR(isModelExists,myModelName);
154     RAISE_FILE_EXIST_ERROR(isFileExists,myName);
155   }
156   INIT_VALUES();
157   myParameters = new PlotMgt_HListOfPlotterParameter ();
158   myIsLoaded = Load ();
159 }
160
161 //==============================================================================
162 Standard_Boolean PlotMgt_Plotter::Load ()
163 {
164   Standard_Boolean fRetVal1 = Standard_True,
165                    fRetVal2 = Standard_True;
166 #ifndef BUC60766
167   if (!myDirectDevice)
168 #endif
169   {
170     myParameters -> Clear ();
171     // Read parameters from file
172     fRetVal1 = ReadParametersFromFile (myModelSystemName, Standard_False);
173     if (fRetVal1) {
174       // PAR file contains all possible FontMap items
175       // We have to remember them in myAllFonts fontmap
176 //      myAllFonts = this -> FontMap ();
177 //      myFontMap.Nullify ();
178       // Further, we read PLO file
179       fRetVal2 = ReadParametersFromFile (mySystemName, Standard_True);
180     }
181   }
182   return (fRetVal1 && fRetVal2);
183 }
184
185 //============================================================================
186 Standard_Boolean PlotMgt_Plotter::NeedToBeSaved () const
187 {
188 #ifndef BUC60766
189   if (!myDirectDevice)
190 #endif
191   {
192     Standard_Integer i, n  = myParameters -> Length ();
193 //    Standard_Boolean fSave = Standard_False;;
194     // Check if we need to save
195     for (i = 1; i <= n; i++) {
196       if (myParameters -> Value(i) -> NeedToBeSaved())
197         return Standard_True;
198     }
199   }
200   return Standard_False;
201 }
202
203 //==============================================================================
204 Standard_Boolean PlotMgt_Plotter::SavePlotter ()
205 {
206   Standard_Integer i, n  = myParameters -> Length ();
207   // Create new file and save plotter to it
208   TCollection_AsciiString aLine;
209   OSD_File aFile = OSD_File (mySystemName);
210   OSD_Protection aProtection;
211   Standard_Boolean fSave;
212   // Create new file (or empty old one)
213   aFile.Build (OSD_WriteOnly, aProtection);
214   // Build and put starting comments
215   aLine  = "! This is a '"; aLine += myName; aLine += "' plotter file\n";
216   aFile.Write (aLine, aLine.Length ());
217   fSave = !aFile.Failed ();
218   // Write all parameters
219   for (i = 1; i <= n && fSave; i++)
220     fSave = myParameters -> Value(i) -> Save (aFile);
221   // Build and put comments at the end
222   if (fSave) {
223     aLine  = "! End of '"; aLine += myName; aLine += "' plotter file\n";
224     aFile.Write (aLine, aLine.Length ());
225   }
226   // Close file
227   aFile.Close ();
228   return (fSave && !aFile.Failed ());
229 }
230
231 //==============================================================================
232 Standard_Boolean PlotMgt_Plotter::Save ()
233 {
234   // Save if necessary
235   if (NeedToBeSaved ()) {
236     // Rename old file
237     OSD_Path anOldPath (mySystemName);
238     anOldPath.SetExtension (".plc_old");
239     OSD_File anOldFile = OSD_File (mySystemName);
240     anOldFile.Move (anOldPath);
241     // Save plotter to the <mySystemName> name.
242     return SavePlotter ();
243   }
244   return Standard_False;
245 }
246
247 //==============================================================================
248 Standard_Boolean PlotMgt_Plotter::SaveAs (const TCollection_AsciiString& aNewName)
249 {
250   // Save if necessary
251   if (NeedToBeSaved ()) {
252     // Set new name (system name) for the plotter
253     myName = aNewName;
254     myName.UpperCase ();
255     mySystemName = DIRPARPLO.Value () + "/" + myName + ".plc";
256     // Save plotter to the new <mySystemName> name.
257     return SavePlotter ();
258   }
259   return Standard_False;
260 }
261
262 //==============================================================================
263 Standard_Boolean PlotMgt_Plotter::CheckConfig (const Standard_Boolean /*theViewIs2D*/)
264 {
265 /*
266   if (!myIsLoaded)
267     return Standard_False;
268
269   TCollection_AsciiString aModel      = Model ();
270   TCollection_AsciiString aOutFormat  = OutputFormat ();
271   PlotMgt_ImageFormat     anImgFormat = ImageFormat ();
272   if (aModel.IsEqual("direct_hpgl2")) { // HPGL2_Driver
273     // direct_hpgl2, dhpgl2, {ENABLE | DISABLE(2D)}
274     return Standard_True;
275   } else if (aModel.IsEqual("direct_ps")) { // PS_Driver
276     // direct_ps, DPS, {ENABLE | DISABLE(2D)}
277     if (!aOutFormat.IsEqual("DPS") ||
278         (anImgFormat != PlotMgt_IF_DISABLE && anImgFormat != PlotMgt_IF_ENABLE))
279     {
280       BAD_PLOTTER_MSG();
281       return Standard_False;
282     }
283     if (anImgFormat == PlotMgt_IF_DISABLE && !theViewIs2D)
284     {
285       BAD_PLOTTER_MSG();
286       return Standard_False;
287     }
288   } else if (aModel.IsEqual("direct_cgm")) { // CGM_Driver
289     // direct_cgm, DCGM, {ENABLE | DISABLE(2D)}
290     if (!aOutFormat.IsEqual("DCGM") ||
291         (anImgFormat != PlotMgt_IF_DISABLE && anImgFormat != PlotMgt_IF_ENABLE))
292     {
293       BAD_PLOTTER_MSG();
294       return Standard_False;
295     }
296     if (anImgFormat == PlotMgt_IF_DISABLE && !theViewIs2D)
297     {
298       BAD_PLOTTER_MSG();
299       return Standard_False;
300     }
301   } else if (aModel.IsEqual("hp")) { // E3Plot_Driver
302     // hp, hpgl, DISABLE(2D)
303     if (!aOutFormat.IsEqual("hpgl") || anImgFormat != PlotMgt_IF_DISABLE ||
304         !theViewIs2D)
305     {
306       BAD_PLOTTER_MSG();
307       return Standard_False;
308     }
309   } else if (aModel.IsEqual("direct_img")) { // ScreenCopy_Driver
310     // direct_img, DISABLE, {XWD | BMP | GIF}
311     if (!aOutFormat.IsEqual("DISABLE") ||
312         (anImgFormat != PlotMgt_IF_XWD && anImgFormat != PlotMgt_IF_BMP &&
313          anImgFormat != PlotMgt_IF_GIF))
314     {
315       BAD_PLOTTER_MSG();
316       return Standard_False;
317     }
318   }
319   // Default
320   if (!theViewIs2D && anImgFormat == PlotMgt_IF_DISABLE)
321     return Standard_False;
322   return Standard_True;
323 */
324   return Standard_True;
325 }
326
327 //==============================================================================
328 // List all plotters (.plc and ,plc_off files ) in DIRPARPLO and DIRPLOT
329 // directories (if specified).
330 //==============================================================================
331 Handle(TColStd_HSequenceOfAsciiString) PlotMgt_Plotter::ListPlotters (
332                                  const Standard_Boolean anActiveOnly)
333 {
334   Handle(TColStd_HSequenceOfAsciiString) aListOfPlotters =
335     new TColStd_HSequenceOfAsciiString ();
336   OSD_Path aDirPlotPath   = DIRPLOT.Value (),
337            aDirParPloPath = DIRPARPLO.Value ();
338   OSD_FileIterator actDirPlot     (aDirPlotPath,   "*.plc"    ),
339                    actDirParPlo   (aDirParPloPath, "*.plc"    ),
340                    inactDirPlot   (aDirPlotPath,   "*.plc_off"),
341                    inactDirParPlo (aDirParPloPath, "*.plc_off");
342   // Firstly list plotters in DIRPARPLO
343   FillListByIterator (aListOfPlotters, actDirParPlo, ".plc");
344   if (!anActiveOnly)
345     FillListByIterator (aListOfPlotters, inactDirParPlo, ".plc_off");
346   // Second step : list plotters in DIRPLOT, skip plotters found in DIRPARPLO
347   FillListByIterator (aListOfPlotters, actDirPlot, ".plc", Standard_True);
348   if (!anActiveOnly)
349     FillListByIterator (aListOfPlotters, inactDirPlot, ".plc_off", Standard_True);
350   return aListOfPlotters;
351 }
352
353 //==============================================================================
354 Standard_Integer PlotMgt_Plotter::FindParameter (const TCollection_AsciiString& aName)
355 {
356   Standard_Integer i, n = NumberOfParameters ();
357   for (i = 1; i <= n; i++) {
358     if (myParameters -> Value(i) -> Name().IsEqual(aName) ||
359         myParameters -> Value(i) -> OldName().IsEqual(aName))
360       return i;
361   }
362   return 0;
363 }
364
365 //==============================================================================
366 void PlotMgt_Plotter::Dump ()
367 {
368   cout << "Plotter '" << Name() << "' dump:\n" << flush;
369   cout << "=================================================\n" << flush;
370   Standard_Integer n = NumberOfParameters ();
371   for (Standard_Integer i = 1; i <= n; i++)
372     myParameters -> Value (i) -> Dump ();
373   cout << "=================================================\n" << flush;
374   cout << "End of dump plotter '" << Name() << "'\n" << flush;
375 }
376
377 //==============================================================================
378 Standard_Boolean PlotMgt_Plotter::ReadParametersFromFile (
379                  const TCollection_AsciiString& aFileName,
380                  const Standard_Boolean fChangeState)
381 {
382   OSD_File                         aFile = OSD_File (OSD_Path (aFileName));
383   OSD_Protection                   aProtection (OSD_R, OSD_R, OSD_R, OSD_R);
384   Standard_Integer                 nBytes, idx, n, i;
385 //  Standard_CString                 aSeparator = ":";
386 //  Standard_CString                 aDelimiter = ".";
387   TCollection_AsciiString          aLine;
388   TCollection_AsciiString          aParam;
389   TCollection_AsciiString          aParamName;
390   TCollection_AsciiString          aParamDef;
391   TCollection_AsciiString          aValue;
392   TCollection_AsciiString          aDescLine;
393   Handle(PlotMgt_PlotterParameter) aParameter;
394   aParameter.Nullify ();
395   if (!aFile.Exists ()) {
396 //    cout << "PlotMgt_Plotter::ReadParametersFromFile() -> '" << aFileName
397 //         << "' could not be found." << endl << flush;
398     return Standard_False;
399   }
400   aFile.Open (OSD_ReadOnly, aProtection);
401   while (!aFile.IsAtEnd ()) {
402     aFile.ReadLine (aLine, MAX_LINE_LEN, nBytes);
403     // Remove all spaces at the begin and end of line
404     STRING_TRIM(aLine);
405     if (aLine.IsEmpty ())
406       continue;
407     // If the line is a comment, skip it
408     if (aLine.Value(1) == '!')
409       continue;
410     // Parse the line to <aParam>:<aValue>
411     if (aLine.Search (":") == -1) {
412       cout << "See line '" << aLine << "'. There is error in it (':' not found)." << endl << flush;
413       continue;
414     }
415     aParam = aLine.Token (":", 1);
416     aLine.Remove (1, aParam.Length() + 1); // ':' also
417     aValue = aLine;
418     STRING_TRIM(aParam);
419     STRING_TRIM(aValue);
420     idx = aParam.Search (".");
421     if (idx == -1) {
422       // <aParam> contains only parameter name
423       aParamName = aParam;
424       aParamDef  = "";
425     } else {
426       // <aParam> is <aName>.<aQualifier>, where <aQualifier> is one of the:
427       // "Type", "Values", "Dialog", "Length".
428       aParamName = aParam.Token (".", 1);
429       aParamDef  = aParam.Token (".", 2);
430       STRING_TRIM(aParamName);
431       STRING_TRIM(aParamDef);
432       aParamDef.Prepend (TCollection_AsciiString ("."));
433     }
434     if ((idx = FindParameter(aParamName))) {
435       aParameter = myParameters -> Value (idx);
436     } else {
437       aParameter = new PlotMgt_PlotterParameter (aParamName);
438       myParameters -> Append (aParameter);
439     }
440     // <fChangeState> is false, if we read PAR file and is true if
441     // we read PLO file.
442     aParameter -> SetState (fChangeState);
443     // Check <aValue> if it's a '.Type'
444     if (aParamDef.IsEqual (_TYPE_SIGN)) {
445       aParameter -> SetType (PlotMgt::TypeFromString(aValue));
446     } else {
447       aLine = aParamName;
448       if (aParamDef != ".")
449         aLine += aParamDef;
450       aLine += _DELIM_SIGN;
451       aLine += aValue;
452       aParameter -> Description () -> Append (aLine);
453     }
454   }
455   aFile.Close ();
456   // Normalize parameters
457   if (fChangeState) {
458     n = NumberOfParameters ();
459     for (i = 1; i <= n; i++)
460       myParameters -> Value (i) -> Normalize ();
461   }
462   return Standard_True;
463 }
464
465 //==============================================================================
466 //==============================================================================
467 //==============================================================================
468 void PlotMgt_Plotter::GetStringValue (const Standard_CString aParam,
469                                       TCollection_AsciiString& aValue)
470 {
471   Standard_Integer anIndex = FindParameter (aParam);
472   if (anIndex >= 1 && anIndex <= NumberOfParameters ())
473     myParameters -> Value (anIndex) -> SValue (aValue);
474 }
475
476 //==============================================================================
477 Standard_Boolean PlotMgt_Plotter::GetBooleanValue (const Standard_CString aParam)
478 {
479   Standard_Integer anIndex = FindParameter (aParam);
480   if (anIndex >= 1 && anIndex <= NumberOfParameters ())
481     return myParameters -> Value (anIndex) -> BValue ();
482   return Standard_False;
483 }
484
485 //==============================================================================
486 Standard_Integer PlotMgt_Plotter::GetIntegerValue (const Standard_CString aParam)
487 {
488   Standard_Integer anIndex = FindParameter (aParam);
489   if (anIndex >= 1 && anIndex <= NumberOfParameters ())
490     return myParameters -> Value (anIndex) -> IValue ();
491   return 0;
492 }
493
494 //==============================================================================
495 Standard_Real PlotMgt_Plotter::GetRealValue (const Standard_CString aParam)
496 {
497   Standard_Integer anIndex = FindParameter (aParam);
498   if (anIndex >= 1 && anIndex <= NumberOfParameters ())
499     return myParameters -> Value (anIndex) -> RValue ();
500   return 0.0;
501 }
502
503 //==============================================================================
504 void PlotMgt_Plotter::GetListValue (const Standard_CString aParam,
505                                     Handle(TColStd_HSequenceOfAsciiString)& aList)
506 {
507   Standard_Integer anIndex = FindParameter (aParam);
508   if (anIndex >= 1 && anIndex <= NumberOfParameters ())
509     myParameters -> Value (anIndex) -> LValues (aList);
510 }
511
512 //==============================================================================
513 void PlotMgt_Plotter::GetIntTable (const Standard_CString aParam,
514                                    Handle(TColStd_HSequenceOfInteger)& aTable)
515 {
516   TCollection_AsciiString aLine;
517   Handle(TColStd_HSequenceOfAsciiString) aMap;
518   aMap.Nullify ();
519   aTable = new TColStd_HSequenceOfInteger ();
520   Standard_Integer i = FindParameter (aParam), n;
521   if (i >= 1 && i <= NumberOfParameters ())
522     aMap = myParameters -> Value (i) -> MValue ();
523   if (!aMap.IsNull()) {
524     n = aMap -> Length ();
525     for (i = 1; i <= n; i++) {
526       aLine = aMap -> Value (i);
527       aLine.RemoveAll (' ');
528       aTable -> Append (
529         (!aLine.IsEmpty () && aLine.IsIntegerValue ()) ?
530         aLine.IntegerValue () : 1);
531     }
532   }
533 }
534
535 //==============================================================================
536 //==============================================================================
537 //==============================================================================
538 void PlotMgt_Plotter::SetStringValue (const Standard_CString aParam,
539                                       TCollection_AsciiString& anOldValue,
540                                       const TCollection_AsciiString& aNewValue)
541 {
542   if (anOldValue != aNewValue) {
543     anOldValue = aNewValue;
544     Standard_Integer anIndex = FindParameter (aParam);
545     if (anIndex >= 1 && anIndex <= NumberOfParameters ())
546       myParameters -> Value (anIndex) -> SetSValue (aNewValue);
547   }
548 }
549
550 //==============================================================================
551 void PlotMgt_Plotter::SetBooleanValue (const Standard_CString aParam,
552                                        const Standard_Boolean aValue)
553 {
554   Standard_Integer anIndex = FindParameter (aParam);
555   if (anIndex >= 1 && anIndex <= NumberOfParameters ()) {
556     if (myParameters -> Value (anIndex) -> BValue () != aValue)
557       myParameters -> Value (anIndex) -> SetBValue (aValue);
558   }
559 }
560
561 //==============================================================================
562 void PlotMgt_Plotter::SetIntegerValue (const Standard_CString aParam,
563                                        const Standard_Integer aValue)
564 {
565   Standard_Integer anIndex = FindParameter (aParam);
566   if (anIndex >= 1 && anIndex <= NumberOfParameters ()) {
567     if (myParameters -> Value (anIndex) -> IValue () != aValue)
568       myParameters -> Value (anIndex) -> SetIValue (aValue);
569   }
570 }
571
572 //==============================================================================
573 void PlotMgt_Plotter::SetRealValue (const Standard_CString aParam,
574                                     const Standard_Real aValue)
575 {
576   Standard_Integer anIndex = FindParameter (aParam);
577   if (anIndex >= 1 && anIndex <= NumberOfParameters ()) {
578     if (myParameters -> Value (anIndex) -> RValue () != aValue)
579       myParameters -> Value (anIndex) -> SetRValue (aValue);
580   }
581 }
582
583 //==============================================================================
584 void PlotMgt_Plotter::SetIntTable (const Standard_CString aParam,
585                                    const Handle(TColStd_HSequenceOfInteger)& aTable)
586 {
587   Standard_Integer anIndex = 0;
588   Standard_Integer i, n ;
589   anIndex = FindParameter (aParam) ;
590   n = aTable -> Length ();
591   if (anIndex >= 1 && anIndex <= NumberOfParameters ()) {
592     Handle(TColStd_HSequenceOfAsciiString) aMap = new TColStd_HSequenceOfAsciiString ();
593     for (i = 1; i <= n; i++)
594       aMap -> Append (aTable -> Value (i));
595     myParameters -> Value (anIndex) -> SetMValue (aMap);
596   }
597 }