public DataRep.CADContainer WalkAssembly(Dictionary<string, DataRep.CADComponent> regularComponents,
                                 List<DataRep.CADEdge> regularEdges,
                                 Dictionary<string, DataRep.CADComponent> size2fitComponents,
                                 List<DataRep.CADEdge> size2fitEdges,
                                 List<DataRep.CADComponent> orphans,
                                 List<string> RefCoordIDs)
        {
            //Dictionary<string, DataRep.CADAssembly> tmpassemblies = new Dictionary<string, DataRep.CADAssembly>();
    
            DataRep.CADContainer assembliesContainer = new DataRep.CADContainer("jklmn");

            List<DataRep.CADEdge> openEdges = new List<DataRep.CADEdge>();
            openEdges = regularEdges;
            List<string> openComponents = regularComponents.Keys.ToList();
            Queue<string> openQ = new Queue<string>();

            assembliesContainer.orphans.AddRange(orphans);

            if (openComponents.Count() == 1 && !openEdges.Any())
            {
                string ID = assemblyID + "|" + newAssemblyIDSeed.ToString();
                DataRep.CADAssembly anassembly = new DataRep.CADAssembly(ID, assemblyName);               //DataRep.CADAssembly anassembly = new DataRep.CADAssembly(assemblyID, assemblyName);
                anassembly.ChildComponents.Add(regularComponents.First().Key, regularComponents.First().Value);
                anassembly.ChildComponents = regularComponents;
                anassembly.ChildEdges = regularEdges;
                ToDAG(anassembly, RefCoordIDs);     // EXPERIMENT!!!
                assembliesContainer.assemblies.Add(assemblyID, anassembly);
            }
            else
            {
                int z = 1;
                while (openEdges.Any())
                {
                    List<DataRep.CADEdge> closedEdges = new List<DataRep.CADEdge>();
                    List<string> closedComponents = new List<string>();

                    DataRep.CADEdge lastEdge = openEdges.Last();
                    string srcid = lastEdge.Src.Id;
                    FindComponentID(srcid,
                                    openComponents,
                                    openQ);
                    
                    WalkIncidentEdges(openQ, 
                                      openComponents, 
                                      closedComponents, 
                                      openEdges, 
                                      closedEdges);
                    
                    // create a new island CAssembly;
                    string ID = assemblyID + "|" + newAssemblyIDSeed.ToString();
                    DataRep.CADAssembly anassembly = new DataRep.CADAssembly(ID, assemblyName + "_" + newAssemblyIDSeed.ToString());
                    foreach (var key in closedComponents)
                    {
                        if (regularComponents.ContainsKey(key))
                        {
                            anassembly.ChildComponents.Add(key, regularComponents[key]);
                            component2assemblyTable[key]= ID;
                        }
                    }

                    anassembly.ChildEdges.AddRange(closedEdges);
                    ToDAG(anassembly, RefCoordIDs);
                    assembliesContainer.assemblies.Add(ID, anassembly);

                    newAssemblyIDSeed++;
                    z++;
                }

                if (openComponents.Any())
                {
                    foreach (string id in openComponents)
                    {
                        DataRep.CADComponent component;
                        if (regularComponents.TryGetValue(id, out component))
                            assembliesContainer.orphans.Add(component);
                    }
                }
                
                // size2fit
                // iterate through Size2Fit (are they orphans or belong to a CAssembly?)
		        // for each size2fit, find its size2fit edges
		        // find which assembly contains the edge's source
		        // if they are in the same 
		        foreach (var item in size2fitComponents)
		        {
			        List<DataRep.CADEdge> s2fclosedEdges = new List<DataRep.CADEdge>();				// <source, CEdge*>
			        string assemblyParent_ID = FindSize2FitEdges(item.Key, size2fitEdges, s2fclosedEdges);

			        // orphan if no edges or parentID is -1
			        if (!s2fclosedEdges.Any() || assemblyParent_ID == "-1")
			        {
                        assembliesContainer.orphans.Add(item.Value);
			        }
			        else
			        {
				        // add size2fit + size2fit edges to island assembly
                        if (assembliesContainer.assemblies.ContainsKey(assemblyParent_ID))
                        {
                            assembliesContainer.assemblies[assemblyParent_ID].ChildSize2FitComponents[item.Key] = item.Value;
                            assembliesContainer.assemblies[assemblyParent_ID].ChildSize2FitEdges.AddRange(s2fclosedEdges);
				        }
			        }
		        }

                // Testing
                //assembliesContainer.ToString();

                // Convert to DAG                
                //ToDAG(assembliesContainer.assemblies, RefCoordIDs);

                Print();

            } // else


            
            return assembliesContainer;
        }
Beispiel #2
0
        private void ProcessCAD(MgaFCO currentobj)
        {
            string outputdir = this.mainParameters.OutputDirectory;

            if (!Directory.Exists(outputdir))
            {
                Directory.CreateDirectory(outputdir);
            }

            string debuglogdir = Path.Combine(outputdir, "log");

            if (!Directory.Exists(debuglogdir))
            {
                Directory.CreateDirectory(debuglogdir);
            }

            string projectdir = this.mainParameters.ProjectDirectory;

            CyPhy2CADSettings cadSetting = (CyPhy2CADSettings)this.mainParameters.config;
            string            cadauxdir  = cadSetting.AuxiliaryDirectory;

            CyPhy.ComponentAssembly curassembly;


            string curObjMetaBase = currentobj.MetaBase.Name;

            if (curObjMetaBase == "TestBench" || curObjMetaBase == "BallisticTestBench" || curObjMetaBase == "CFDTestBench" || curObjMetaBase == "BlastTestBench" || curObjMetaBase == "KinematicTestBench")
            {
                CyPhy.TestBenchType tb = CyPhyClasses.TestBenchType.Cast(currentobj);
                if (result != null && curObjMetaBase == "BlastTestBench")
                {
                    result.Labels = JobManager.Job.DefaultLabels + "&&SwRI_Blast";
                }
                if (result != null && curObjMetaBase == "KinematicTestBench")
                {
                    result.Labels = JobManager.Job.DefaultLabels + "&&Adams";
                }

                var catlsut = tb.Children.ComponentAssemblyCollection.FirstOrDefault();     // should be an instance b/c elaborate was called earlier
                if (catlsut == null)
                {
                    result.Success = false;
                    throw new Exception("There is no elaborated system under test component assembly in the model!");
                }

                curassembly = catlsut;

                if (curassembly == null)
                {
                    result.Success = false;
                    throw new Exception("No Valid Component Assembly.");
                }

                // META-1971: ADM + ACM file export for blast + ballistics
                if (curObjMetaBase == "BallisticTestBench" || curObjMetaBase == "BlastTestBench")
                {
                    // ADM: Export DDP 2.x version (XML)
                    {
                        var    design        = CyPhy2DesignInterchange.CyPhy2DesignInterchange.Convert(catlsut, this.result.Traceability);
                        string TestBenchName = tb.Name;

                        string admDir = Path.Combine(cadSetting.OutputDirectory, "DesignADM");
                        if (!Directory.Exists(admDir))
                        {
                            Directory.CreateDirectory(admDir);
                        }
                        OpenMETA.Interchange.AvmXmlSerializer.SaveToFile(Path.Combine(admDir, TestBenchName + ".adm"), design);
                    }
                }
                // end META-1971

                // META-2987
                GenerateCADParameterMapping(tb,
                                            outputdir, new List <object>());

                CADFlatDataCreator datacreator = new CADFlatDataCreator(debuglogdir, this.mainParameters.ProjectDirectory, CadFormat);
                datacreator.Traceability = this.result.Traceability;
                datacreator.CreateFlatData(curassembly);
                DataRep.CADContainer cadcontainer = datacreator.CreateCADDataContainer(curassembly.Attributes.ConfigurationUniqueID,
                                                                                       UtilityHelpers.CleanString2(curassembly.Name));

                using (StreamWriter writer = new StreamWriter(Path.Combine(outputdir, "log", "CyPhy2CAD_Graphviz_Representation.gv")))
                {
                    writer.WriteLine(cadcontainer.ToGraphviz(true));
                }

                if (!cadcontainer.IsAnalyzable() && curObjMetaBase != "TestBench")
                {
                    result.Success = false;
                    //Logger.Instance.AddLogMessage("Test Bench can not proceed because the test bench contains islands and/or orphans! Please see graphviz file in /log directory for details.", Severity.Error);
                    throw new META.InterpreterException("Test Bench can not proceed because the test bench contains islands and/or orphans, see graphviz file in /log/CyPhy2CAD_Graphviz_Representation.gv for details. Please remove islands/orphans and try again.");
                }

                TestBenchModel.TestBenchBase testBenchRep = TestBenchModelFactory.CreateTestBenchModel(curObjMetaBase,
                                                                                                       cadSetting,
                                                                                                       outputdir,
                                                                                                       projectdir,
                                                                                                       Automation);

                testBenchRep.cadDataContainer = cadcontainer;
                testBenchRep.CopySTL          = this.CopySTL;

                if (curObjMetaBase != "ComponentAssembly")
                {
                    testBenchRep.TraverseTestBench(tb);
                }

                testBenchRep.CollectDirectories();
                result.Success = testBenchRep.GenerateOutputFiles();
            }
            else if (curObjMetaBase == "CADTestBench")
            {
                CyPhy.CADTestBench tb = CyPhyClasses.CADTestBench.Cast(currentobj);
                // META-1701: label for Abaqus
                if (result != null)
                {
                    Dictionary <CyPhyClasses.CADTestBench.AttributesClass.SolverType_enum, string> labelMap = new Dictionary <CyPhyClasses.CADTestBench.AttributesClass.SolverType_enum, string>()
                    {
                        { CyPhyClasses.CADTestBench.AttributesClass.SolverType_enum.ABAQUS_Deck_Based, "Abaqus" },
                        { CyPhyClasses.CADTestBench.AttributesClass.SolverType_enum.ABAQUS_Model_Based, "Abaqus" },
                        { CyPhyClasses.CADTestBench.AttributesClass.SolverType_enum.NASTRAN, "Nastran" },
                    };
                    string label = "Abaqus";
                    labelMap.TryGetValue(tb.Attributes.SolverType, out label);
                    result.Labels += "&&" + label;
                }
                var toplevelSUT = tb.Children.ComponentAssemblyCollection.FirstOrDefault();     // should be an instance b/c elaborate was called earlier
                if (toplevelSUT == null)
                {
                    result.Success = false;
                    throw new Exception("There is no elaborated system under test component assembly in the model!");
                }

                CADFlatDataCreator datacreator = new CADFlatDataCreator(debuglogdir, this.mainParameters.ProjectDirectory, CadFormat);
                datacreator.Traceability = this.result.Traceability;
                datacreator.CreateFlatData(tb,
                                           toplevelSUT.Path);
                DataRep.CADContainer cadcontainer = datacreator.CreateCADDataContainer(tb.Guid.ToString(),
                                                                                       UtilityHelpers.CleanString2(tb.Name));

                using (StreamWriter writer = new StreamWriter(Path.Combine(outputdir, "log", "CyPhy2CAD_Graphviz_Representation.gv")))
                {
                    writer.WriteLine(cadcontainer.ToGraphviz(true));
                }
                result.Success = false;

                if (!cadcontainer.IsAnalyzable())
                {
                    //Logger.Instance.AddLogMessage("FEA Test Bench can not proceed because the test bench contains islands and/or orphans! Please see graphviz file in /log directory for details.", Severity.Error);
                    throw new META.InterpreterException("FEA Test Bench can not proceed because the test bench contains islands and/or orphans, see graphviz file in /log/CyPhy2CAD_Graphviz_Representation.gv for details. Please remove islands/orphans and try again.");
                }

                TestBenchModel.TestBenchBase testBenchRep = TestBenchModelFactory.CreateTestBenchModel(curObjMetaBase,
                                                                                                       cadSetting,
                                                                                                       outputdir,
                                                                                                       projectdir,
                                                                                                       Automation);
                testBenchRep.cadDataContainer = cadcontainer;
                testBenchRep.CopySTL          = this.CopySTL;
                testBenchRep.TraverseTestBench(tb);
                testBenchRep.CollectDirectories();
                result.Success = testBenchRep.GenerateOutputFiles();

                List <object> mappings = new List <object>();
                if (testBenchRep is TestBenchModel.FEATestBench)
                {
                    var feaRep = (TestBenchModel.FEATestBench)testBenchRep;
                    mappings = feaRep.TestBenchParameterMappings;
                }
                // META-2987
                GenerateCADParameterMapping(tb, outputdir, mappings);
            }
            else if (curObjMetaBase == "ComponentAssembly")
            {
                curassembly = CyPhyClasses.ComponentAssembly.Cast(currentobj);
                CADFlatDataCreator datacreator = new CADFlatDataCreator(debuglogdir, this.mainParameters.ProjectDirectory, CadFormat);
                datacreator.Traceability = this.result.Traceability;
                datacreator.CreateFlatData(curassembly);
                DataRep.CADContainer cadcontainer = datacreator.CreateCADDataContainer(curassembly.Guid.ToString(),
                                                                                       UtilityHelpers.CleanString2(curassembly.Name));

                TestBenchModel.TestBenchBase testbenchbase = new TestBenchModel.TestBenchBase(cadSetting,
                                                                                              outputdir,
                                                                                              projectdir);
                testbenchbase.cadDataContainer = cadcontainer;
                testbenchbase.CopySTL          = this.CopySTL;
                testbenchbase.CollectDirectories();
            }
            else
            {
                result.Success = false;
                throw new NotImplementedException(String.Format("Running Cyphy2CAD on {0} is not implemented.", curObjMetaBase));
            }
        }