Fatal error при передаче данных в метод

Автор Тема: Fatal error при передаче данных в метод  (Прочитано 8415 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Тема содержит сообщение с Решением. Нажмите здесь чтобы посмотреть его.

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Здравствуйте!
Столкнулся с fatal error при передаче исходных данных в метод. Команда запускается, принимает пользовательский ввод и после этого вылетает. Такое поведение возникло после введения в код передачи в методы переменной curFormat, содержащей результаты пользовательского ввода. Проект компилируется без ошибок но не работает. В чем я ошибаюсь? Ведь я могу передать методу на вход любую переменную.




Код - C# [Выбрать]
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using Autodesk.AutoCAD.Runtime;
  6. using Autodesk.AutoCAD.ApplicationServices;
  7. using Autodesk.AutoCAD.DatabaseServices;
  8. using Autodesk.AutoCAD.Geometry;
  9. using Autodesk.AutoCAD.EditorInput;
  10. using Autodesk.AutoCAD.Colors;
  11.  
  12. namespace ITAT_Autocad
  13. {
  14.  
  15.      public class Format
  16.      {
  17.           private string formatID;
  18.           private int multiplier;
  19.           private double height;
  20.           private double width;
  21.           private string orientation;
  22.           private string type;
  23.  
  24.  
  25.           public string FormatID { get => formatID; set => formatID=value; }
  26.           public int Multiplier { get => multiplier; set => multiplier=value; }
  27.           public double Height { get => height; set => height=value; }
  28.           public double Width { get => width; set => width=value; }
  29.           public string Orientation { get => orientation; set => orientation=value; }
  30.           public string Type { get => type; set => type=value; }
  31.  
  32.      }
  33.  
  34.      public class GOST_Titles
  35.      {
  36.           static double curWidth;
  37.           static double curHeight;
  38.          
  39.           public static List<Format> listOfFormats = new List<Format>
  40.                                                      {
  41.                                                      new Format { FormatID = "A4", Height = 297, Width = 210 },
  42.                                                      new Format { FormatID = "A3", Height = 420, Width = 297 },
  43.                                                      new Format { FormatID = "A2", Height = 594, Width = 420 },
  44.                                                      new Format { FormatID = "A1", Height = 841, Width = 594 },
  45.                                                      new Format { FormatID = "A0", Height = 1189, Width = 841 }
  46.                                                      };
  47.  
  48.  
  49.           public static Format GetDataFromUser ()
  50.           {
  51.  
  52.                Document acDoc = Application.DocumentManager.MdiActiveDocument;
  53.                //Выбрать формат
  54.                PromptKeywordOptions chFormat = new PromptKeywordOptions("\nChoose format: ");
  55.  
  56.                chFormat.Keywords.Add("A4");
  57.                chFormat.Keywords.Add("A3");
  58.                chFormat.Keywords.Add("A2");
  59.                chFormat.Keywords.Add("A1");
  60.                chFormat.Keywords.Add("A0");
  61.                chFormat.AllowNone=false;
  62.  
  63.                PromptResult formatID = acDoc.Editor.GetKeywords(chFormat);
  64.                //Application.ShowAlertDialog("The name entered was: "+formatID.StringResult);
  65.  
  66.                //Установить кратность
  67.                PromptStringOptions chMultiplier = new PromptStringOptions("\nSet multiplier: ");
  68.                chMultiplier.AllowSpaces=false;
  69.                PromptResult multiplier = acDoc.Editor.GetString(chMultiplier);
  70.  
  71.                // Установить ориентацию
  72.                PromptKeywordOptions chOrient = new PromptKeywordOptions("\nSet orientation: ");
  73.  
  74.                chOrient.Keywords.Add("Portrait");
  75.                chOrient.Keywords.Add("Landscape");
  76.                chOrient.Keywords.Default="Landscape";
  77.                chOrient.AllowNone=false;
  78.  
  79.                PromptResult orientation = acDoc.Editor.GetKeywords(chOrient);
  80.  
  81.                // Установить тип
  82.                PromptKeywordOptions chType = new PromptKeywordOptions("\nSet type: ");
  83.  
  84.                chType.Keywords.Add("Title");
  85.                chType.Keywords.Add("Regular");
  86.                chType.Keywords.Default="Regular";
  87.                chType.AllowNone=false;
  88.  
  89.                PromptResult type = acDoc.Editor.GetKeywords(chType);
  90.  
  91.                Format curFormat = new Format
  92.                {
  93.                     FormatID=formatID.StringResult,
  94.                     Multiplier=int.Parse(multiplier.StringResult),
  95.                     Orientation=orientation.StringResult,
  96.                     Type=type.StringResult,
  97.  
  98.                };
  99.                return curFormat;
  100.           }
  101.  
  102.  
  103.           public static Format inFormat = GetDataFromUser();
  104.           public static Format curFormat = inFormat;
  105.  
  106.  
  107.           [CommandMethod("2InsertTitle")]
  108.  
  109.           public static void DrawFormat ( Format curFormat )
  110.           {
  111.  
  112.                if ( curFormat.FormatID=="A4" )
  113.                {
  114.                     if ( curFormat.Orientation=="Portrait" )
  115.                     {
  116.                          curHeight=listOfFormats[ 0 ].Height;
  117.                          curWidth=listOfFormats[ 0 ].Width*curFormat.Multiplier;
  118.                     }
  119.                     else
  120.                     {
  121.                          curHeight=listOfFormats[ 0 ].Width;
  122.                          curWidth=listOfFormats[ 0 ].Height;
  123.                     }
  124.                }
  125.                if ( curFormat.FormatID=="A3" )
  126.                {
  127.                     if ( curFormat.Orientation=="Portrait" )
  128.                     {
  129.                          curHeight=listOfFormats[ 1 ].Height;
  130.                          curWidth=listOfFormats[ 1 ].Width*curFormat.Multiplier;
  131.                     }
  132.                     else
  133.                     {
  134.                          curHeight=listOfFormats[ 1 ].Width;
  135.                          curWidth=listOfFormats[ 1 ].Height;
  136.                     }
  137.                }
  138.                if ( curFormat.FormatID=="A2" )
  139.                {
  140.                     if ( curFormat.Orientation=="Portrait" )
  141.                     {
  142.                          curHeight=listOfFormats[ 2 ].Height;
  143.                          curWidth=listOfFormats[ 2 ].Width*curFormat.Multiplier;
  144.                     }
  145.                     else
  146.                     {
  147.                          curHeight=listOfFormats[ 2 ].Width;
  148.                          curWidth=listOfFormats[ 2 ].Height;
  149.                     }
  150.                }
  151.                if ( curFormat.FormatID=="A1" )
  152.                {
  153.                     if ( curFormat.Orientation=="Portrait" )
  154.                     {
  155.                          curHeight=listOfFormats[ 3 ].Height;
  156.                          curWidth=listOfFormats[ 3 ].Width*curFormat.Multiplier;
  157.                     }
  158.                     else
  159.                     {
  160.                          curHeight=listOfFormats[ 3 ].Width;
  161.                          curWidth=listOfFormats[ 3 ].Height;
  162.                     }
  163.                }
  164.                if ( curFormat.FormatID=="A0" )
  165.                {
  166.                     if ( curFormat.Orientation=="Portrait" )
  167.                     {
  168.                          curHeight=listOfFormats[ 4 ].Height;
  169.                          curWidth=listOfFormats[ 4 ].Width*curFormat.Multiplier;
  170.                     }
  171.                     else
  172.                     {
  173.                          curHeight=listOfFormats[ 4 ].Width;
  174.                          curWidth=listOfFormats[ 4 ].Height;
  175.                     }
  176.                }
  177.  
  178.                frPoint1=new Point2d(-curWidth+5, curHeight-5);
  179.                frPoint2=new Point2d(5, curHeight-5);
  180.                frPoint3=new Point2d(5, -5);
  181.                frPoint4=new Point2d(-curWidth+5, -5);
  182.                keyPoint1=new Point2d(-curWidth+25, curHeight-10);
  183.                keyPoint2=new Point2d(0, curHeight-10);
  184.                keyPoint3=new Point2d(0, 0);
  185.                keyPoint4=new Point2d(-curWidth+25, 0);
  186.  
  187.                if ( curFormat.Type=="Regular" ) { DrawR(); }
  188.                else { DrawM(); }
  189.  
  190.           }
  191.  
  192.           public static void DrawM ()
  193.           {
  194.                Document acDoc = Application.DocumentManager.MdiActiveDocument;
  195.                Database acCurDb = acDoc.Database;
  196.                using ( Transaction acTrans = acCurDb.TransactionManager.StartTransaction() )
  197.                {
  198.                     LayerTable acLyrTbl;
  199.                     acLyrTbl=acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead) as LayerTable;
  200.  
  201.                     string LayerName = "-10-Formats";
  202.  
  203.                     if ( acLyrTbl.Has(LayerName)==false )
  204.                          using ( LayerTableRecord acLyrTblRec = new LayerTableRecord() )
  205.                          {
  206.                               // Assign the layer the ACI color 3 and a name
  207.                               acLyrTblRec.Color=Color.FromColorIndex(ColorMethod.ByAci, 7);
  208.                               acLyrTblRec.Name=LayerName;
  209.  
  210.                               // Upgrade the Layer table for write
  211.                               acLyrTbl.UpgradeOpen();
  212.  
  213.                               // Append the new layer to the Layer table and the transaction
  214.                               acLyrTbl.Add(acLyrTblRec);
  215.                               acTrans.AddNewlyCreatedDBObject(acLyrTblRec, true);
  216.                          }
  217.  
  218.                     //acCurDb.Clayer=acLyrTbl[ LayerName ];
  219.                     BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
  220.  
  221.                     ObjectId blkRecId = ObjectId.Null;
  222.  
  223.                     if ( !acBlkTbl.Has("MainTitle"+" "+LayoutManager.Current.CurrentLayout) )
  224.                     {
  225.                          BlockTableRecord acBlkTblRec = new BlockTableRecord();
  226.  
  227.                          acBlkTblRec.Name="MainTitle"+" "+LayoutManager.Current.CurrentLayout;
  228.  
  229.                          // Set the insertion point for the block
  230.                          acBlkTblRec.Origin=new Point3d(0, 0, 0);
  231.                          acBlkTbl.UpgradeOpen();
  232.                          acBlkTbl.Add(acBlkTblRec);
  233.                          acTrans.AddNewlyCreatedDBObject(acBlkTblRec, true);
  234.  
  235.                          //Draw frontiers of format
  236.                          DrawFrames(acTrans, acBlkTblRec);
  237.  
  238.                          //Draw upper title of format
  239.                          DrawUpperTitle(acTrans, acBlkTbl, acBlkTblRec, curFormat);
  240.  
  241.                          //Draw main title of format
  242.                          DrawMainTitle(acTrans, acBlkTbl, acBlkTblRec);
  243.  
  244.                          //DrawRegularTitle(acTrans, acBlkTbl, acBlkTblRec);
  245.  
  246.                          DrawSideTitle(acTrans, acBlkTbl, acBlkTblRec);
  247.  
  248.  
  249.                          blkRecId=acBlkTblRec.Id;
  250.                     }
  251.                     else
  252.                     {
  253.                          blkRecId=acBlkTbl[ "MainTitle"+" "+LayoutManager.Current.CurrentLayout ];
  254.                     }
  255.  
  256.                     // Insert the block into the current space
  257.                     if ( blkRecId!=ObjectId.Null )
  258.                     {
  259.                          BlockTableRecord acBlkTblRec;
  260.                          acBlkTblRec=acTrans.GetObject(blkRecId, OpenMode.ForRead) as BlockTableRecord;
  261.  
  262.                          // Create and insert the new block reference
  263.                          BlockReference acBlkRef = new BlockReference(acBlkTblRec.Origin, blkRecId);
  264.                          acBlkRef.SetDatabaseDefaults();
  265.  
  266.                          BlockTableRecord acCurSpaceBlkTblRec;
  267.                          acCurSpaceBlkTblRec=
  268.                          acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  269.  
  270.                          acCurSpaceBlkTblRec.AppendEntity(acBlkRef);
  271.                          acTrans.AddNewlyCreatedDBObject(acBlkRef, true);
  272.  
  273.                          // Verify block table record has attribute definitions associated with it
  274.                          if ( acBlkTblRec.HasAttributeDefinitions )
  275.                               foreach ( ObjectId objID in acBlkTblRec )
  276.                               {
  277.                                    DBObject dbObj = acTrans.GetObject(objID, OpenMode.ForRead);
  278.  
  279.                                    if ( dbObj is AttributeDefinition )
  280.                                    {
  281.                                         AttributeDefinition acAtt = dbObj as AttributeDefinition;
  282.  
  283.                                         if ( !acAtt.Constant )
  284.                                         {
  285.                                              AttributeReference acAttRef = new AttributeReference();
  286.                                              acAttRef.SetAttributeFromBlock(acAtt, acBlkRef.BlockTransform);
  287.                                              acAttRef.TextString=acAtt.TextString;
  288.                                              acBlkRef.AttributeCollection.AppendAttribute(acAttRef);
  289.                                              acTrans.AddNewlyCreatedDBObject(acAttRef, true);
  290.                                         }
  291.                                    }
  292.                               }
  293.                     }
  294.  
  295.                     // Save the new object to the database
  296.                     acTrans.Commit();
  297.                }
  298.           }
  299.           public static void DrawR ()
  300.           {
  301.                Document acDoc = Application.DocumentManager.MdiActiveDocument;
  302.                Database acCurDb = acDoc.Database;
  303.                using ( Transaction acTrans = acCurDb.TransactionManager.StartTransaction() )
  304.                {
  305.                     LayerTable acLyrTbl;
  306.                     acLyrTbl=acTrans.GetObject(acCurDb.LayerTableId, OpenMode.ForRead) as LayerTable;
  307.  
  308.                     string LayerName = "-10-Formats";
  309.  
  310.                     if ( acLyrTbl.Has(LayerName)==false )
  311.                          using ( LayerTableRecord acLyrTblRec = new LayerTableRecord() )
  312.                          {
  313.                               // Assign the layer the ACI color 3 and a name
  314.                               acLyrTblRec.Color=Color.FromColorIndex(ColorMethod.ByAci, 7);
  315.                               acLyrTblRec.Name=LayerName;
  316.  
  317.                               // Upgrade the Layer table for write
  318.                               acLyrTbl.UpgradeOpen();
  319.  
  320.                               // Append the new layer to the Layer table and the transaction
  321.                               acLyrTbl.Add(acLyrTblRec);
  322.                               acTrans.AddNewlyCreatedDBObject(acLyrTblRec, true);
  323.                          }
  324.  
  325.                     //acCurDb.Clayer=acLyrTbl[ LayerName ];
  326.                     BlockTable acBlkTbl = acTrans.GetObject(acCurDb.BlockTableId, OpenMode.ForRead) as BlockTable;
  327.  
  328.                     ObjectId blkRecId = ObjectId.Null;
  329.  
  330.                     if ( !acBlkTbl.Has("RegularTitle"+" "+LayoutManager.Current.CurrentLayout) )
  331.                     {
  332.                          BlockTableRecord acBlkTblRec = new BlockTableRecord();
  333.                          acBlkTblRec.Name="RegularTitle"+" "+LayoutManager.Current.CurrentLayout;
  334.  
  335.                          // Set the insertion point for the block
  336.                          acBlkTblRec.Origin=new Point3d(0, 0, 0);
  337.                          acBlkTbl.UpgradeOpen();
  338.                          acBlkTbl.Add(acBlkTblRec);
  339.                          acTrans.AddNewlyCreatedDBObject(acBlkTblRec, true);
  340.  
  341.                          //Draw frontiers of format
  342.                          DrawFrames(acTrans, acBlkTblRec);
  343.  
  344.                          //Draw upper title of format
  345.                          DrawUpperTitle(acTrans, acBlkTbl, acBlkTblRec, curFormat);
  346.  
  347.                          //Draw main title of format
  348.                          //DrawMainTitle(acTrans, acBlkTbl, acBlkTblRec);
  349.                          DrawRegularTitle(acTrans, acBlkTbl, acBlkTblRec);
  350.                          DrawSideTitle(acTrans, acBlkTbl, acBlkTblRec);
  351.  
  352.                          blkRecId=acBlkTblRec.Id;
  353.                     }
  354.                     else
  355.                     {
  356.                          blkRecId=acBlkTbl[ "RegularTitle"+" "+LayoutManager.Current.CurrentLayout ];
  357.                     }
  358.  
  359.                     // Insert the block into the current space
  360.                     if ( blkRecId!=ObjectId.Null )
  361.                     {
  362.                          BlockTableRecord acBlkTblRec;
  363.                          acBlkTblRec=acTrans.GetObject(blkRecId, OpenMode.ForRead) as BlockTableRecord;
  364.  
  365.                          // Create and insert the new block reference
  366.                          BlockReference acBlkRef = new BlockReference(acBlkTblRec.Origin, blkRecId);
  367.                          acBlkRef.SetDatabaseDefaults();
  368.  
  369.                          BlockTableRecord acCurSpaceBlkTblRec;
  370.                          acCurSpaceBlkTblRec=
  371.                          acTrans.GetObject(acCurDb.CurrentSpaceId, OpenMode.ForWrite) as BlockTableRecord;
  372.  
  373.                          acCurSpaceBlkTblRec.AppendEntity(acBlkRef);
  374.                          acTrans.AddNewlyCreatedDBObject(acBlkRef, true);
  375.  
  376.                          // Verify block table record has attribute definitions associated with it
  377.                          if ( acBlkTblRec.HasAttributeDefinitions )
  378.                               foreach ( ObjectId objID in acBlkTblRec )
  379.                               {
  380.                                    DBObject dbObj = acTrans.GetObject(objID, OpenMode.ForRead);
  381.  
  382.                                    if ( dbObj is AttributeDefinition )
  383.                                    {
  384.                                         AttributeDefinition acAtt = dbObj as AttributeDefinition;
  385.  
  386.                                         if ( !acAtt.Constant )
  387.                                         {
  388.                                              AttributeReference acAttRef = new AttributeReference();
  389.                                              acAttRef.SetAttributeFromBlock(acAtt, acBlkRef.BlockTransform);
  390.                                              //acAttRef.Position = acAtt.Position.TransformBy(acBlkRef.BlockTransform);
  391.                                              acAttRef.TextString=acAtt.TextString;
  392.                                              acBlkRef.AttributeCollection.AppendAttribute(acAttRef);
  393.                                              acTrans.AddNewlyCreatedDBObject(acAttRef, true);
  394.                                         }
  395.                                    }
  396.                               }
  397.                     }
  398.  
  399.                     // Save the new object to the database
  400.                     acTrans.Commit();
  401.                }
  402.           }
  403.  
  404.           public static void DrawMainTitle ( Transaction acTrans, BlockTable acBlkTbl, BlockTableRecord acBlkTblRec )
  405.           {
  406.                тут код метода
  407.           }
  408.  
  409.           public static void DrawRegularTitle ( Transaction acTrans, BlockTable acBlkTbl, BlockTableRecord acBlkTblRec )
  410.           {
  411.             тут код метода  
  412.  
  413.           }
  414.  
  415.  
  416.           public static void DrawUpperTitle ( Transaction acTrans, BlockTable acBlkTbl, BlockTableRecord acBlkTblRec, Format curFormat )
  417.           {
  418.                Format initFormat = new Format()
  419.                {
  420.                     Orientation=curFormat.Orientation,
  421.                     Multiplier=curFormat.Multiplier,
  422.                };
  423.  
  424.                if ( initFormat.Orientation=="Portrait"&&initFormat.Multiplier==1 )
  425.                {
  426.                     Polyline nFrame = new Polyline(3);
  427.                     nFrame.SetDatabaseDefaults();
  428.                     nFrame.AddVertexAt(0, new Point2d(keyPoint2.X-14, keyPoint2.Y), 0, 0, 0);
  429.                     nFrame.AddVertexAt(1, new Point2d(keyPoint2.X-14, keyPoint2.Y-70), 0, 0, 0);
  430.                     nFrame.AddVertexAt(2, new Point2d(keyPoint2.X, keyPoint2.Y-70), 0, 0, 0);
  431.                     nFrame.LineWeight=LineWeight.LineWeight060;
  432.                     nFrame.Layer="-10-Formats";
  433.                     acBlkTblRec.AppendEntity(nFrame);
  434.                     acTrans.AddNewlyCreatedDBObject(nFrame, true);
  435.                     using ( AttributeDefinition drawingNo2 = new AttributeDefinition() )
  436.                     {
  437.                          drawingNo2.SetDatabaseDefaults(acBlkTbl.Database);
  438.                          drawingNo2.Verifiable=true;
  439.                          drawingNo2.Prompt="U Drawing Number";
  440.                          drawingNo2.Tag="UDrawingNumber";
  441.                          drawingNo2.TextString="DR";
  442.                          drawingNo2.WidthFactor=0.6;
  443.                          drawingNo2.Height=8;
  444.                          drawingNo2.Rotation=Math.PI/2;
  445.                          drawingNo2.Justify=AttachmentPoint.BottomCenter;
  446.                          drawingNo2.Position=new Point3d(keyPoint2.X+1, keyPoint2.Y-35, 0);
  447.                          drawingNo2.AlignmentPoint=new Point3d(keyPoint2.X+1, keyPoint2.Y-35, 0);
  448.                          drawingNo2.AdjustAlignment(acBlkTbl.Database);
  449.                          drawingNo2.Layer="-10-Formats";
  450.  
  451.                          acBlkTblRec.AppendEntity(drawingNo2);
  452.                     }
  453.                }
  454.                else
  455.                {
  456.                     Polyline nFrame = new Polyline(3);
  457.                     nFrame.SetDatabaseDefaults();
  458.                     nFrame.AddVertexAt(0, new Point2d(keyPoint1.X+70, keyPoint1.Y), 0, 0, 0);
  459.                     nFrame.AddVertexAt(1, new Point2d(keyPoint1.X+70, keyPoint1.Y-14), 0, 0, 0);
  460.                     nFrame.AddVertexAt(2, new Point2d(keyPoint1.X, keyPoint1.Y-14), 0, 0, 0);
  461.                     nFrame.LineWeight=LineWeight.LineWeight060;
  462.                     nFrame.Layer="-10-Formats";
  463.                     acBlkTblRec.AppendEntity(nFrame);
  464.                     acTrans.AddNewlyCreatedDBObject(nFrame, true);
  465.                     using ( AttributeDefinition drawingNo2 = new AttributeDefinition() )
  466.                     {
  467.                          drawingNo2.SetDatabaseDefaults(acBlkTbl.Database);
  468.                          drawingNo2.Verifiable=true;
  469.                          drawingNo2.Prompt="U Drawing Number";
  470.                          drawingNo2.Tag="UDrawingNumber";
  471.                          drawingNo2.TextString="DR";
  472.                          drawingNo2.WidthFactor=0.6;
  473.                          drawingNo2.Height=8;
  474.                          drawingNo2.Rotation=Math.PI;
  475.                          drawingNo2.Justify=AttachmentPoint.BottomCenter;
  476.                          drawingNo2.Position=new Point3d(keyPoint1.X+35, keyPoint1.Y-1, 0);
  477.                          drawingNo2.AlignmentPoint=new Point3d(keyPoint1.X+35, keyPoint1.Y, 0);
  478.                          drawingNo2.AdjustAlignment(acBlkTbl.Database);
  479.                          drawingNo2.Layer="-10-Formats";
  480.  
  481.                          acBlkTblRec.AppendEntity(drawingNo2);
  482.                     }
  483.                }
  484.           }
  485.  
  486.           public static void DrawSideTitle ( Transaction acTrans, BlockTable acBlkTbl, BlockTableRecord acBlkTblRec )
  487.           {
  488.             тут код метода
  489.           }
  490.  
  491.           public static void DrawFrames ( Transaction acTrans, BlockTableRecord acBlkTblRec )
  492.           {
  493.              тут код метода
  494.           }
  495.  
  496.      }
  497.  
  498. }

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при передаче данных в метод
« Ответ #1 : 01-06-2018, 22:42:41 »
Столкнулся с fatal error при передаче исходных данных в метод.
Каких данных? В какой метод? Запусти под отладчиком, выполни пошаговую трассировку, убедись, что код выполняется по тому сценарию, на который ты рассчитываешь.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при передаче данных в метод
« Ответ #2 : 01-06-2018, 23:59:26 »
Под отладчиком выполнение доходит до метода public static void DrawFormat ( Format curFormat ) и при входе в него вылетает fatal error. До этого команда отрабатывает без проблем.


Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при передаче данных в метод
« Ответ #3 : 02-06-2018, 00:04:53 »
DrawFormat
Фу черт! У метода с атрибутом CommandMethod (т.е. тем, который будет командой) не может быть никаких (!!!) параметров.
Ты совсем не понимаешь того, что делаешь. Этот метод будет вызываться AutoCAD'ом при запуске команды 2InsertTitle. Откуда он может знать про какие-то параметры???
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при передаче данных в метод
« Ответ #4 : 02-06-2018, 00:20:17 »
Поясню, мне нужно один раз запросить пользователя, получить от него данные и на их основе создать блок форматки.

Я реализовал это через метод GetDataFromUser, возвращающий класс Format.
Далее для организации выбора мне надо как-то передать данные от пользователя внутрь вызывающего метода. Как это сделать если метод не принимает параметры?
Данные пользователя я могу определить только в переменной на уровне класса, иначе они не видны другим методам. Почему вызывающий метод не может знать о параметрах если перед ним уже отработал метод GetDataFromUser и собрал их?

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при передаче данных в метод
« Ответ #5 : 02-06-2018, 00:30:18 »
1. Обращаться к AutoCAD можно из командных методов, но вот это - ересь и так делать нельзя ни в коем случае:
Код - C# [Выбрать]
  1. public static Format inFormat = GetDataFromUser();
2. Если тебе нужно что-то определить (в частности вызвать метод  GetDataFromUser), то вызови его из DrawFormat. В чем проблема?
Если нужно чтобы он вызывался однократно, то вызови его однократно, установи признак того, что он уже вызвался, чтобы при следующем запуске команды он не вызвался. Результаты можешь хранить в статической переменной на уровне класса.



Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при передаче данных в метод
« Ответ #6 : 02-06-2018, 00:32:47 »
Почему вызывающий метод не может знать о параметрах если перед ним уже отработал метод GetDataFromUser и собрал их?
Потому, что вызвает этот метод сам AutoCAD. И для него есть четкие правила каким может быть метод с атрибутом CommandMethod. Этот метод ничего не возвращает (void) и не принимает никаких параметров. Всё.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при передаче данных в метод
« Ответ #7 : 02-06-2018, 00:32:47 »
Если я не передаю внутрь метода данные, то у меня при повторном вызове команды заново не происходит диалог с пользователем, а просто рисуется форматка по ранее введенным данным что неправильно. Поэтому я и стал пытаться передавать в метод исходные данные. Но не сработало. Спасибо Вам за терпение Александр Ривилис, советы мне очень помогают. В программировании я совсем чайник это да, но многие вещи API неочевидны ведь стартовый метод в С# static void Main(string[] args) принимает string[] args хотя с него тоже начинается программа.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при передаче данных в метод
« Ответ #8 : 02-06-2018, 00:35:06 »
В программировании я совсем чайник это да, но многие вещи API неочевидны ведь стартовый метод в С# static void Main(string[] args) принимает string[] args хотя с него тоже начинается программа.
Это только в случае, когда создаётся exe-файл. В данном случае создаётся dll-файл, у которого нет метода Main.
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при передаче данных в метод
« Ответ #9 : 02-06-2018, 00:36:56 »
Если нужно чтобы он вызывался однократно, то вызови его однократно, установи признак того, что он уже вызвался, чтобы при следующем запуске команды он не вызвался. Результаты можешь хранить в статической переменной на уровне класса.
А как я вытащу данные в переменную на уровне класса если мой метод Void? Ведь он не может ничего из себя выдать наружу. Или есть какой то способ? Что за признак и как он устанавливается? Можно мне ссылку на пример, я с таким еще не сталкивался.

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при передаче данных в метод
« Ответ #10 : 02-06-2018, 00:41:50 »
1. Убираешь:
Код - C# [Выбрать]
  1. public static Format inFormat = GetDataFromUser();
  2. public static Format curFormat = inFormat;
2. Объявляешь там же:
Код - C# [Выбрать]
  1. public static Format curFormat = null;
3. В методе DrawFormat пишешь:
Код - C# [Выбрать]
  1. if (curFormat == null) curFormat = GetDataFromUser();
Всё.


Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при передаче данных в метод
« Ответ #11 : 02-06-2018, 00:50:32 »
Fatal error исчез, но я оказался на исходной - при повторном вызове команды заново не происходит диалог с пользователем, а просто рисуется форматка по ранее введенным данным что неправильно. Именно с этой ситуацией я боролся чем и словил fatal error. Замкнутый круг.

Отмечено как Решение Atomohod 02-06-2018, 02:07:38

Оффлайн Александр Ривилис

  • Administrator
  • *****
  • Сообщений: 13894
  • Карма: 1789
  • Рыцарь ObjectARX
  • Skype: rivilis
Re: Fatal error при передаче данных в метод
« Ответ #12 : 02-06-2018, 00:53:43 »
Fatal error исчез, но я оказался на исходной - при повторном вызове команды заново не происходит диалог с пользователем, а просто рисуется форматка по ранее введенным данным что неправильно.
Так тебе каждый раз нужно спрашивать у пользователя форматку? Тогда вместо:
Код - C# [Выбрать]
  1. if (curFormat == null) curFormat = GetDataFromUser();
должно быть:
Код - C# [Выбрать]
  1. curFormat = GetDataFromUser();
Вообще-то это азы программирования на любом языке, а не только C#.
 
Не забывайте про правильное Форматирование кода на форуме
Создание и добавление Autodesk Screencast видео в сообщение на форуме
Если Вы задали вопрос и на форуме появился правильный ответ, то не забудьте про кнопку Решение

Оффлайн AtomohodАвтор темы

  • ADN OPEN
  • ****
  • Сообщений: 453
  • Карма: 1
Re: Fatal error при передаче данных в метод
« Ответ #13 : 02-06-2018, 01:06:15 »
Супер!!! Наконец заработало. Спасибо огромное.