示例#1
0
        static void Main(string[] args)
        {
            var ionPlan = DomainBuilder.BuildFromFile(@"D:\CALIBRATION_2.5SS_10x10_50MUPS.dcm", "IonPlan");

            DomainWriter.WriteObjects(ionPlan, @"D:\DomainObjects");
            //SOPClassUIDBuilder.BuildSOPClassUIDs(@"D:\OneDrive\Cardan.Code\Git\Evil-DICOM\EvilDICOM\EvilDICOM\Core\Helpers\SOPClassUID.cs");
            //SOPClassUIDBuilder.BuildSOPClassDictionary(@"D:\OneDrive\Cardan.Code\Git\Evil-DICOM\EvilDICOM\EvilDICOM\Core\Helpers\SOPClassDictionary.cs");
            //SOPClassUIDBuilder.BuildSOPClass(@"D:\OneDrive\Cardan.Code\Git\Evil-DICOM\EvilDICOM\EvilDICOM\Core\Enums\SOPClass.cs");
            var g = GeneratorBuilder.Instance.Generator;

            //DICOMDefinitionLoader.UpdateCurrentFromWeb();
            var dictionary = DICOMDictionary.Instance.Entries;

            // Get Anonymization tags
            var anonTags = DICOMDefinitionLoader.LoadAnonymizationTags().ToList();

            var forgeNodes         = new List <SyntaxNode>();
            var tags               = new List <SyntaxNode>();
            var selectors          = new List <SyntaxNode>();
            var seqSelectors       = new List <SyntaxNode>();
            var anonymizationNodes = new List <SyntaxNode>();

            List <SyntaxNode> anonProfile = new List <SyntaxNode>();

            anonProfile.Add(g.AssignmentStatement(g.IdentifierName("var profile"), g.IdentifierName("new List<IDICOMElement>()")));
            foreach (var atag in anonTags)
            {
                var action = "AnonymizeAction.REMOVE_ELEMENT";
                switch (atag.Metadata)
                {
                case "D": action = "AnonymizeAction.DUMMY_DATA"; break;

                case "Z":
                case "Z/D": action = "AnonymizeAction.NULL_DATA"; break;

                case "X/Z":
                case "X/D":
                case "X/Z/D":
                case "X": action = "AnonymizeAction.REMOVE_ELEMENT"; break;

                case "K":
                case "C": action = "AnonymizeAction.CLEAN"; break;

                case "X/Z/U*":
                case "U": action = "AnonymizeAction.CLEAN"; break;
                }
                atag.VR = dictionary.FirstOrDefault(d => d.Id == atag.Id)?.VR;
                var entry = g.IdentifierName($"yield return new ConfidentialElement(){{Id=\"{atag.Id}\", ElementName=\"{atag.Name}\", VR=VR.{VRDictionary.GetVRFromAbbreviation(atag.VR)}, Action = {action}}} )");
                anonProfile.Add(entry);
            }
            anonProfile.Add(g.ReturnStatement(g.IdentifierName("profile")));

            var method = g.MethodDeclaration("GenerateProfileElements", null, null, g.IdentifierName("List<IDICOMElement>"), Accessibility.Public, DeclarationModifiers.Static, anonProfile);

            var anonNode = g.ClassDeclaration("AnonStub",
                                              null,
                                              Accessibility.Public,
                                              DeclarationModifiers.Static, null, null, new SyntaxNode[] { method });
            var anonMethod = g.CompilationUnit(anonNode).NormalizeWhitespace().ToString();



            foreach (var entry in dictionary.Where(d => !string.IsNullOrEmpty(d.Keyword)))
            {
                //Build a tag no matter what
                tags.Add(TagBuilder.Generate(g, entry));

                var(cName, parameter) = EntryParser.Parse(g, entry);

                if (cName != null)
                {
                    //SELECTOR
                    var(propGetStatements, propSetStatements) = SelectorBuilder.GeneratePropertyStatements(g, cName, entry);
                    var sel = g.PropertyDeclaration(entry.Keyword, g.IdentifierName(cName), Accessibility.Public,
                                                    DeclarationModifiers.None, propGetStatements, propSetStatements);
                    selectors.Add(sel);
                    seqSelectors.Add(g.PropertyDeclaration(entry.Keyword, g.IdentifierName(cName), Accessibility.Public,
                                                           DeclarationModifiers.ReadOnly, SelectorBuilder.GenerateSequencePropertyStatements(g, cName, entry), null));

                    // return _dicom.FindAll("00000000").Select(d => d as UnsignedLong).ToList();
                    var returnMany = g.ReturnStatement(g.InvocationExpression(
                                                           g.IdentifierName($"_dicom.FindAll(\"{entry.Id}\").Select(d => d as {cName}).ToList")));
                    var returnManySeq = g.ReturnStatement(g.InvocationExpression(
                                                              g.IdentifierName($"Items.FindAll<{cName}>(\"{entry.Id}\").ToList")));
                    selectors.Add(g.PropertyDeclaration(entry.Keyword + "_", g.IdentifierName($"List<{cName}>"),
                                                        Accessibility.Public, DeclarationModifiers.ReadOnly, new SyntaxNode[] { returnMany }));
                    var selSeqProp = g.PropertyDeclaration(entry.Keyword + "_", g.IdentifierName($"List<{cName}>"),
                                                           Accessibility.Public, DeclarationModifiers.ReadOnly, new SyntaxNode[] { returnManySeq });

                    seqSelectors.Add(selSeqProp);
                    //FORGE
                    var methStatements = new SyntaxNode[]
                    {
                        // return new UnsignedLong { Tag = new Tag("00000001") };
                        g.AssignmentStatement(g.IdentifierName("var element"),
                                              g.ObjectCreationExpression(g.IdentifierName(cName))),
                        g.AssignmentStatement(g.IdentifierName("element.Tag"),
                                              g.ObjectCreationExpression(g.IdentifierName("Tag"),
                                                                         g.Argument(RefKind.None, g.LiteralExpression(entry.Id)))),
                        g.AssignmentStatement(g.IdentifierName("element.Data_"), g.IdentifierName("data?.ToList()")),
                        g.ReturnStatement(g.IdentifierName("element"))
                    };

                    var m = g.MethodDeclaration(entry.Keyword, new SyntaxNode[] { parameter }, null, g.IdentifierName(cName), Accessibility.Public,
                                                DeclarationModifiers.Static, methStatements);
                    forgeNodes.Add(m);
                }
            }



            var forgeNode = g.ClassDeclaration("DICOMForge",
                                               null,
                                               Accessibility.Public,
                                               DeclarationModifiers.Static, null, null, forgeNodes);
            var namespaceDeclaration = g.NamespaceDeclaration("EvilDICOM.Core", forgeNode);

            forgeNode = g.CompilationUnit(UsingsHelper.GetUsings().Concat(new SyntaxNode[] { namespaceDeclaration })).NormalizeWhitespace();
            //public UnsignedLong CommandGroupLength
            //{
            //    get { return _dicom.FindFirst("00000000") as UnsignedLong; }
            //set { _dicom.ReplaceOrAdd(value); }
            //}

            var tagHelperNode = g.ClassDeclaration("TagHelper",
                                                   null,
                                                   Accessibility.Public,
                                                   DeclarationModifiers.Static, null, null, tags);

            namespaceDeclaration = g.NamespaceDeclaration("EvilDICOM.Core.Helpers", tagHelperNode);
            tagHelperNode        = g.CompilationUnit(UsingsHelper.GetUsings().Concat(new SyntaxNode[] { namespaceDeclaration })).NormalizeWhitespace();

            var selectorNode = g.ClassDeclaration("DICOMSelector",
                                                  null,
                                                  Accessibility.Public,
                                                  DeclarationModifiers.Partial, null, null, selectors);

            namespaceDeclaration = g.NamespaceDeclaration("EvilDICOM.Core.Selection", selectorNode);
            selectorNode         = g.CompilationUnit(UsingsHelper.GetUsings().Concat(new SyntaxNode[] { namespaceDeclaration })).NormalizeWhitespace();

            var selectorSeqNode = g.ClassDeclaration("SequenceSelector",
                                                     null,
                                                     Accessibility.Public,
                                                     DeclarationModifiers.Partial, g.IdentifierName("AbstractElement<DICOMSelector>"), null, seqSelectors);

            namespaceDeclaration = g.NamespaceDeclaration("EvilDICOM.Core.Selection", selectorSeqNode);
            selectorSeqNode      = g.CompilationUnit(UsingsHelper.GetUsings().Concat(new SyntaxNode[] { namespaceDeclaration })).NormalizeWhitespace();

            //File.WriteAllText(@"D:\OneDrive\Cardan.Code\Git\Evil-DICOM\EvilDICOM\EvilDICOM\Core\DICOMForge.cs", forgeNode.NormalizeWhitespace().ToString());
            //File.WriteAllText(@"D:\OneDrive\Cardan.Code\Git\Evil-DICOM\EvilDICOM\EvilDICOM\Core\Helpers\TagHelper.cs", tagHelperNode.NormalizeWhitespace().ToString());
            File.WriteAllText(@"D:\OneDrive\Cardan.Code\Git\Evil-DICOM\EvilDICOM\EvilDICOM\Core\Selection\DICOMSelectorProperties.cs", selectorNode.NormalizeWhitespace().ToString());
            File.WriteAllText(@"D:\OneDrive\Cardan.Code\Git\Evil-DICOM\EvilDICOM\EvilDICOM\Core\Selection\SequenceSelectorProperties.cs", selectorSeqNode.NormalizeWhitespace().ToString());
        }