From d41f25c32fa92558e2f3ca4a6832ed18ea6ba487 Mon Sep 17 00:00:00 2001 From: Tim Chipman Date: Sat, 12 Sep 2015 12:48:00 -0500 Subject: [PATCH] IfcDoc 9.4 - formatting, merging, UI expansion --- ChangeLogGenerator.cs | 50 ++- CtlExpressG.cs | 5 + CtlParameters.Designer.cs | 183 ++++++-- CtlParameters.cs | 111 ++++- CtlParameters.resx | 86 ++-- CtlProperties.Designer.cs | 242 ++++++++--- CtlProperties.cs | 195 ++++++++- CtlProperties.resx | 388 +++++++++++++++-- CtlRules.cs | 9 +- DifferenceEngine.cs | 602 +++++++++++++++++++++++++++ DocumentationISO.cs | 512 ++++++++++++++++------- FormAbout.Designer.cs | 15 +- FormAbout.resx | 14 +- FormConstraint.ja.resx | 71 +--- FormConstraint.resx | 538 ++++++++++++------------ FormEdit.Designer.cs | 207 +++++---- FormEdit.cs | 737 ++++++++++++++++++++++++--------- FormEdit.resx | 194 +++++++-- FormMerge.Designer.cs | 86 +++- FormMerge.cs | 467 ++++++++++++++++++++- FormMerge.ja.resx | 71 +++- FormMerge.resx | 404 ++++++++++-------- FormParameters.Designer.cs | 3 +- FormParameters.cs | 12 + FormParameters.resx | 55 ++- FormPublish.ja.resx | 21 - FormPublish.resx | 119 +++--- FormReference.Designer.cs | 10 + FormReference.cs | 44 +- FormReference.ja.resx | 42 +- FormReference.resx | 357 ++++++++-------- FormRule.Designer.cs | 14 +- FormRule.ja.resx | 61 +-- FormRule.resx | 437 +++++++++---------- FormSelectEntity.Designer.cs | 59 ++- FormSelectEntity.cs | 95 ++++- FormSelectEntity.ja.resx | 15 - FormSelectEntity.resx | 381 ++++++++++------- FormSelectLocale.ja.resx | 19 +- FormSelectLocale.resx | 173 ++++---- FormSelectProperty.Designer.cs | 107 +++++ FormSelectProperty.cs | 135 ++++++ FormSelectProperty.resx | 172 ++++++++ FormatEXP.cs | 25 +- FormatHTM.cs | 351 ++++++++-------- FormatPNG.cs | 2 + FormatSPF.cs | 11 +- FormatXSD.cs | 5 +- IfcDoc.csproj | 31 ++ IfcDoc.sln | 4 +- IfcDoc.v12.suo | Bin 299520 -> 492544 bytes NBIMS.cs | 21 +- Program.cs | 127 ++++-- Properties/AssemblyInfo.cs | 4 +- Schema.cs | 78 +++- SchemaDoc.cs | 690 +++++++++++++++++++++++++----- SchemaMvd.cs | 51 ++- xsd1.txt | 2 +- 58 files changed, 6503 insertions(+), 2417 deletions(-) create mode 100644 DifferenceEngine.cs create mode 100644 FormSelectProperty.Designer.cs create mode 100644 FormSelectProperty.cs create mode 100644 FormSelectProperty.resx diff --git a/ChangeLogGenerator.cs b/ChangeLogGenerator.cs index bad0d64d..3418bc8a 100644 --- a/ChangeLogGenerator.cs +++ b/ChangeLogGenerator.cs @@ -15,6 +15,41 @@ public class ChangeLogGenerator /// The current project where change log entries are generated. public static void Generate(DocProject projectPrev, DocProject projectCurr) { + // copy over any previous change logs + foreach(DocChangeSet prevCS in projectPrev.ChangeSets) + { + DocChangeSet currCS = new DocChangeSet(); + currCS.Name = prevCS.Name; + currCS.Documentation = prevCS.Documentation; + currCS.VersionBaseline = prevCS.VersionBaseline; + currCS.VersionCompared = prevCS.VersionCompared; + projectCurr.ChangeSets.Add(currCS); + + foreach(DocChangeAction prevCA in prevCS.ChangesEntities) + { + DocChangeAction currCA = prevCA.Copy(); + currCS.ChangesEntities.Add(currCA); + } + + if (prevCS.ChangesProperties != null) + { + foreach (DocChangeAction prevCA in prevCS.ChangesProperties) + { + DocChangeAction currCA = prevCA.Copy(); + currCS.ChangesProperties.Add(currCA); + } + } + + if (prevCS.ChangesQuantities != null) + { + foreach (DocChangeAction prevCA in prevCS.ChangesQuantities) + { + DocChangeAction currCA = prevCA.Copy(); + currCS.ChangesQuantities.Add(currCA); + } + } + } + // build maps Dictionary mapNew = new Dictionary(); foreach (DocSection docSection in projectCurr.Sections) @@ -139,12 +174,15 @@ public static void Generate(DocProject projectPrev, DocProject projectCurr) { docChangeType.Action = DocChangeActionEnum.MOVED; docChangeType.Aspects.Add(new DocChangeAspect(DocChangeAspectEnum.SCHEMA, docOtherSchema.Name.ToUpper(), docSchema.Name.ToUpper())); + docTypeBase = docOtherType; + break; } } } } } - else + + if(docTypeBase != null) { // existing type @@ -276,6 +314,11 @@ public static void Generate(DocProject projectPrev, DocProject projectCurr) // compare entities foreach (DocEntity docEntity in docSchema.Entities) { + if (docEntity.Name.Equals("IfcWindowLiningProperties")) + { + docEntity.ToString(); + } + DocChangeAction docChangeEntity = new DocChangeAction(); docChangeSchema.Changes.Add(docChangeEntity); docChangeEntity.Name = docEntity.Name; @@ -309,6 +352,7 @@ public static void Generate(DocProject projectPrev, DocProject projectCurr) docChangeEntity.Action = DocChangeActionEnum.MOVED; docChangeEntity.Aspects.Add(new DocChangeAspect(DocChangeAspectEnum.SCHEMA, docOtherSchema.Name.ToUpper(), docSchema.Name.ToUpper())); + break; } } } @@ -480,11 +524,11 @@ public static void Generate(DocProject projectPrev, DocProject projectCurr) } //todo: add generic check that traverses multiple levels of defined types; in the interest of hitting deadline, hard-coded hack for now - if (docNew.Name == "IfcPositiveInteger" && docAspect.OldValue == "INTEGER") + if (docNew != null && docNew.Name == "IfcPositiveInteger" && docAspect.OldValue == "INTEGER") { impact = false; } - if (docNew.Name == "IfcBinary" && docAspect.OldValue == "BINARY (32)") + if (docNew != null && docNew.Name == "IfcBinary" && docAspect.OldValue == "BINARY (32)") { impact = false; } diff --git a/CtlExpressG.cs b/CtlExpressG.cs index 7cc62471..d1c4b81b 100644 --- a/CtlExpressG.cs +++ b/CtlExpressG.cs @@ -500,6 +500,11 @@ public void LayoutDefinition(DocDefinition selection) docAttr.DiagramLine[1].Y = selection.DiagramRectangle.Y + (selection.DiagramRectangle.Height * (double)each / (double)(count+1)); docAttr.DiagramLine[2].Y = selection.DiagramRectangle.Y + (selection.DiagramRectangle.Height * (double)each / (double)(count+1)); } + + if (docAttr.DiagramLabel == null) + { + docAttr.DiagramLabel = new DocRectangle(); + } docAttr.DiagramLabel.X = docAttr.DiagramLine[0].X; docAttr.DiagramLabel.Y = docAttr.DiagramLine[2].Y - 20.0; } diff --git a/CtlParameters.Designer.cs b/CtlParameters.Designer.cs index fa122a6e..2a450deb 100644 --- a/CtlParameters.Designer.cs +++ b/CtlParameters.Designer.cs @@ -29,9 +29,9 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(CtlParameters)); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle4 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle5 = new System.Windows.Forms.DataGridViewCellStyle(); - System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle6 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle(); + System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle3 = new System.Windows.Forms.DataGridViewCellStyle(); this.toolStrip1 = new System.Windows.Forms.ToolStrip(); this.toolStripButtonTemplateInsert = new System.Windows.Forms.ToolStripButton(); this.toolStripButtonTemplateRemove = new System.Windows.Forms.ToolStripButton(); @@ -43,11 +43,22 @@ private void InitializeComponent() this.toolStripMenuItemModeOverride = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemModeSuppress = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripButtonConceptTemplate = new System.Windows.Forms.ToolStripButton(); - this.dataGridViewConceptRules = new System.Windows.Forms.DataGridView(); this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); this.toolStripButtonItemOptional = new System.Windows.Forms.ToolStripButton(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripButtonShowFailures = new System.Windows.Forms.ToolStripButton(); + this.toolStripComboBoxOperator = new System.Windows.Forms.ToolStripComboBox(); + this.dataGridViewConceptRules = new System.Windows.Forms.DataGridView(); + this.splitContainer1 = new System.Windows.Forms.SplitContainer(); + this.listView1 = new System.Windows.Forms.ListView(); + this.columnHeaderInstance = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.toolStrip1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.dataGridViewConceptRules)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).BeginInit(); + this.splitContainer1.Panel1.SuspendLayout(); + this.splitContainer1.Panel2.SuspendLayout(); + this.splitContainer1.SuspendLayout(); this.SuspendLayout(); // // toolStrip1 @@ -62,7 +73,10 @@ private void InitializeComponent() this.toolStripSplitButtonInheritance, this.toolStripButtonConceptTemplate, this.toolStripSeparator2, - this.toolStripButtonItemOptional}); + this.toolStripButtonItemOptional, + this.toolStripSeparator3, + this.toolStripButtonShowFailures, + this.toolStripComboBoxOperator}); this.toolStrip1.Location = new System.Drawing.Point(0, 0); this.toolStrip1.Name = "toolStrip1"; this.toolStrip1.Size = new System.Drawing.Size(400, 25); @@ -172,37 +186,83 @@ private void InitializeComponent() this.toolStripButtonConceptTemplate.Text = "Change Template"; this.toolStripButtonConceptTemplate.Click += new System.EventHandler(this.toolStripButtonConceptTemplate_Click); // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + // + // toolStripButtonItemOptional + // + this.toolStripButtonItemOptional.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonItemOptional.Enabled = false; + this.toolStripButtonItemOptional.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonItemOptional.Image"))); + this.toolStripButtonItemOptional.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonItemOptional.Name = "toolStripButtonItemOptional"; + this.toolStripButtonItemOptional.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonItemOptional.Text = "Optional"; + this.toolStripButtonItemOptional.Click += new System.EventHandler(this.toolStripButtonItemOptional_Click); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(6, 25); + // + // toolStripButtonShowFailures + // + this.toolStripButtonShowFailures.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.toolStripButtonShowFailures.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonShowFailures.Image"))); + this.toolStripButtonShowFailures.ImageTransparentColor = System.Drawing.Color.Magenta; + this.toolStripButtonShowFailures.Name = "toolStripButtonShowFailures"; + this.toolStripButtonShowFailures.Size = new System.Drawing.Size(23, 22); + this.toolStripButtonShowFailures.Text = "Show Failed Instances"; + this.toolStripButtonShowFailures.Click += new System.EventHandler(this.toolStripButtonShowFailures_Click); + // + // toolStripComboBoxOperator + // + this.toolStripComboBoxOperator.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; + this.toolStripComboBoxOperator.Items.AddRange(new object[] { + "AND", + "OR", + "NOT", + "NAND", + "NOR", + "XOR", + "NXOR"}); + this.toolStripComboBoxOperator.Name = "toolStripComboBoxOperator"; + this.toolStripComboBoxOperator.Size = new System.Drawing.Size(121, 25); + this.toolStripComboBoxOperator.SelectedIndexChanged += new System.EventHandler(this.toolStripComboBoxOperator_SelectedIndexChanged); + // // dataGridViewConceptRules // - dataGridViewCellStyle4.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle4.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle4.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle4.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle4.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.dataGridViewConceptRules.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle4; + dataGridViewCellStyle1.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle1.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle1.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle1.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle1.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle1.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle1.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridViewConceptRules.ColumnHeadersDefaultCellStyle = dataGridViewCellStyle1; this.dataGridViewConceptRules.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridViewCellStyle5.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle5.BackColor = System.Drawing.SystemColors.Window; - dataGridViewCellStyle5.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle5.ForeColor = System.Drawing.SystemColors.ControlText; - dataGridViewCellStyle5.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle5.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle5.WrapMode = System.Windows.Forms.DataGridViewTriState.False; - this.dataGridViewConceptRules.DefaultCellStyle = dataGridViewCellStyle5; + dataGridViewCellStyle2.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle2.BackColor = System.Drawing.SystemColors.Window; + dataGridViewCellStyle2.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle2.ForeColor = System.Drawing.SystemColors.ControlText; + dataGridViewCellStyle2.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle2.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle2.WrapMode = System.Windows.Forms.DataGridViewTriState.False; + this.dataGridViewConceptRules.DefaultCellStyle = dataGridViewCellStyle2; this.dataGridViewConceptRules.Dock = System.Windows.Forms.DockStyle.Fill; - this.dataGridViewConceptRules.Location = new System.Drawing.Point(0, 25); + this.dataGridViewConceptRules.Location = new System.Drawing.Point(0, 0); this.dataGridViewConceptRules.MultiSelect = false; this.dataGridViewConceptRules.Name = "dataGridViewConceptRules"; - dataGridViewCellStyle6.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; - dataGridViewCellStyle6.BackColor = System.Drawing.SystemColors.Control; - dataGridViewCellStyle6.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - dataGridViewCellStyle6.ForeColor = System.Drawing.SystemColors.WindowText; - dataGridViewCellStyle6.SelectionBackColor = System.Drawing.SystemColors.Highlight; - dataGridViewCellStyle6.SelectionForeColor = System.Drawing.SystemColors.HighlightText; - dataGridViewCellStyle6.WrapMode = System.Windows.Forms.DataGridViewTriState.True; - this.dataGridViewConceptRules.RowHeadersDefaultCellStyle = dataGridViewCellStyle6; + dataGridViewCellStyle3.Alignment = System.Windows.Forms.DataGridViewContentAlignment.MiddleLeft; + dataGridViewCellStyle3.BackColor = System.Drawing.SystemColors.Control; + dataGridViewCellStyle3.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + dataGridViewCellStyle3.ForeColor = System.Drawing.SystemColors.WindowText; + dataGridViewCellStyle3.SelectionBackColor = System.Drawing.SystemColors.Highlight; + dataGridViewCellStyle3.SelectionForeColor = System.Drawing.SystemColors.HighlightText; + dataGridViewCellStyle3.WrapMode = System.Windows.Forms.DataGridViewTriState.True; + this.dataGridViewConceptRules.RowHeadersDefaultCellStyle = dataGridViewCellStyle3; this.dataGridViewConceptRules.Size = new System.Drawing.Size(400, 375); this.dataGridViewConceptRules.TabIndex = 5; this.dataGridViewConceptRules.CellContentClick += new System.Windows.Forms.DataGridViewCellEventHandler(this.dataGridViewConceptRules_CellContentClick); @@ -213,33 +273,63 @@ private void InitializeComponent() this.dataGridViewConceptRules.UserAddedRow += new System.Windows.Forms.DataGridViewRowEventHandler(this.dataGridViewConceptRules_UserAddedRow); this.dataGridViewConceptRules.UserDeletedRow += new System.Windows.Forms.DataGridViewRowEventHandler(this.dataGridViewConceptRules_UserDeletedRow); // - // toolStripSeparator2 + // splitContainer1 // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(6, 25); + this.splitContainer1.Dock = System.Windows.Forms.DockStyle.Fill; + this.splitContainer1.Location = new System.Drawing.Point(0, 25); + this.splitContainer1.Name = "splitContainer1"; + this.splitContainer1.Orientation = System.Windows.Forms.Orientation.Horizontal; // - // toolStripButtonItemOptional + // splitContainer1.Panel1 // - this.toolStripButtonItemOptional.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.toolStripButtonItemOptional.Enabled = false; - this.toolStripButtonItemOptional.Image = ((System.Drawing.Image)(resources.GetObject("toolStripButtonItemOptional.Image"))); - this.toolStripButtonItemOptional.ImageTransparentColor = System.Drawing.Color.Magenta; - this.toolStripButtonItemOptional.Name = "toolStripButtonItemOptional"; - this.toolStripButtonItemOptional.Size = new System.Drawing.Size(23, 22); - this.toolStripButtonItemOptional.Text = "Optional"; - this.toolStripButtonItemOptional.Click += new System.EventHandler(this.toolStripButtonItemOptional_Click); + this.splitContainer1.Panel1.Controls.Add(this.dataGridViewConceptRules); + // + // splitContainer1.Panel2 + // + this.splitContainer1.Panel2.Controls.Add(this.listView1); + this.splitContainer1.Panel2Collapsed = true; + this.splitContainer1.Size = new System.Drawing.Size(400, 375); + this.splitContainer1.SplitterDistance = 199; + this.splitContainer1.TabIndex = 6; + // + // listView1 + // + this.listView1.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderInstance, + this.columnHeaderName}); + this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; + this.listView1.Location = new System.Drawing.Point(0, 0); + this.listView1.Name = "listView1"; + this.listView1.Size = new System.Drawing.Size(150, 46); + this.listView1.TabIndex = 0; + this.listView1.UseCompatibleStateImageBehavior = false; + this.listView1.View = System.Windows.Forms.View.Details; + // + // columnHeaderInstance + // + this.columnHeaderInstance.Text = "#"; + this.columnHeaderInstance.Width = 120; + // + // columnHeaderName + // + this.columnHeaderName.Text = "Name"; + this.columnHeaderName.Width = 200; // // CtlParameters // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.Controls.Add(this.dataGridViewConceptRules); + this.Controls.Add(this.splitContainer1); this.Controls.Add(this.toolStrip1); this.Name = "CtlParameters"; this.Size = new System.Drawing.Size(400, 400); this.toolStrip1.ResumeLayout(false); this.toolStrip1.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.dataGridViewConceptRules)).EndInit(); + this.splitContainer1.Panel1.ResumeLayout(false); + this.splitContainer1.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainer1)).EndInit(); + this.splitContainer1.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -261,5 +351,12 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripButton toolStripButtonConceptTemplate; private System.Windows.Forms.ToolStripSeparator toolStripSeparator2; private System.Windows.Forms.ToolStripButton toolStripButtonItemOptional; + private System.Windows.Forms.ToolStripSeparator toolStripSeparator3; + private System.Windows.Forms.ToolStripButton toolStripButtonShowFailures; + private System.Windows.Forms.SplitContainer splitContainer1; + private System.Windows.Forms.ListView listView1; + private System.Windows.Forms.ColumnHeader columnHeaderInstance; + private System.Windows.Forms.ColumnHeader columnHeaderName; + private System.Windows.Forms.ToolStripComboBox toolStripComboBoxOperator; } } diff --git a/CtlParameters.cs b/CtlParameters.cs index ca947d1c..4d6e3e99 100644 --- a/CtlParameters.cs +++ b/CtlParameters.cs @@ -15,6 +15,7 @@ public partial class CtlParameters : UserControl { DocProject m_project; DocConceptRoot m_conceptroot; + DocObject m_conceptitem; // optional outer item DocTemplateUsage m_conceptleaf; DocModelRule m_selectedcolumn; Dictionary m_map; @@ -80,6 +81,18 @@ public DocConceptRoot ConceptRoot } } + public DocObject ConceptItem + { + get + { + return this.m_conceptitem; + } + set + { + this.m_conceptitem = value; + } + } + /// /// The concept defining rows of items with parameters /// @@ -120,24 +133,24 @@ public SEntity CurrentInstance if (row.Tag != null) { DocTemplateItem item = (DocTemplateItem)row.Tag; - bool result; if (this.m_instance != null) { - if (item.ValidationStructure.TryGetValue(this.m_instance, out result)) + bool? testresult = item.GetResultForObject(this.m_instance); + if(testresult != null && testresult.Value) + { + row.DefaultCellStyle.BackColor = System.Drawing.Color.Lime; + } + else { - if (result) + if (item.Optional) { - row.DefaultCellStyle.BackColor = System.Drawing.Color.Lime; + row.DefaultCellStyle.BackColor = System.Drawing.Color.Yellow; } else { row.DefaultCellStyle.BackColor = System.Drawing.Color.Red; } } - else - { - row.DefaultCellStyle.BackColor = System.Drawing.Color.Red;// Yellow; - } } else { @@ -145,6 +158,40 @@ public SEntity CurrentInstance } } } + + this.listView1.Items.Clear(); + + if (docUsage != null && this.CurrentInstance != null) + { + List listMismatch = docUsage.GetValidationMismatches(this.CurrentInstance, this.ConceptItem); + foreach (SEntity o in listMismatch) + { + ListViewItem lvi = new ListViewItem(); + lvi.Tag = o; + lvi.Text = o.OID.ToString(); + + System.Reflection.FieldInfo field = o.GetType().GetField("Name"); + if (field != null) + { + object oname = field.GetValue(o); + if (oname != null) + { + System.Reflection.FieldInfo fieldValue = oname.GetType().GetField("Value"); + if (fieldValue != null) + { + oname = fieldValue.GetValue(oname); + } + + if(oname != null) + { + lvi.SubItems.Add(oname.ToString()); + } + } + } + + this.listView1.Items.Add(lvi); + } + } } } @@ -170,6 +217,8 @@ private void LoadInheritance() this.toolStripSplitButtonInheritance.Image = this.toolStripMenuItemModeInherit.Image; this.toolStripMenuItemModeInherit.Checked = true; } + + this.toolStripComboBoxOperator.SelectedIndex = (int)this.m_conceptleaf.Operator; } private void LoadUsage() @@ -190,11 +239,17 @@ private void LoadUsage() foreach (DocModelRule rule in this.m_columns) { DataGridViewColumn column = new DataGridViewColumn(); + column.Tag = rule; column.HeaderText = rule.Identification; column.ValueType = typeof(string);//? column.CellTemplate = new DataGridViewTextBoxCell(); column.Width = 200; + if(rule.IsCondition()) + { + column.HeaderText += "?"; + } + // override cell template for special cases DocConceptRoot docConceptRoot = (DocConceptRoot)this.m_conceptroot; DocEntity docEntity = this.m_project.GetDefinition(docUsage.Definition.Type) as DocEntity;// docConceptRoot.ApplicableEntity; @@ -292,12 +347,15 @@ private void LoadUsage() private void dataGridViewConceptRules_SelectionChanged(object sender, EventArgs e) { + if (this.m_editcon) + return; + //toolStripButtonTemplateInsert this.toolStripButtonTemplateRemove.Enabled = (this.dataGridViewConceptRules.SelectedRows.Count == 1 && this.dataGridViewConceptRules.SelectedRows[0].Index < this.dataGridViewConceptRules.Rows.Count - 1); this.toolStripButtonMoveDown.Enabled = (this.dataGridViewConceptRules.SelectedRows.Count == 1 && this.dataGridViewConceptRules.SelectedRows[0].Index < this.dataGridViewConceptRules.Rows.Count - 2); // exclude New row this.toolStripButtonMoveUp.Enabled = (this.dataGridViewConceptRules.SelectedRows.Count == 1 && this.dataGridViewConceptRules.SelectedRows[0].Index > 0 && this.dataGridViewConceptRules.SelectedRows[0].Index < this.dataGridViewConceptRules.Rows.Count - 1); this.toolStripButtonItemOptional.Enabled = (this.dataGridViewConceptRules.SelectedRows.Count == 1); - if (this.dataGridViewConceptRules.SelectedRows.Count > 0) + if (this.dataGridViewConceptRules.SelectedRows.Count > 0 && this.dataGridViewConceptRules.SelectedRows[0].Tag is DocTemplateItem) { this.toolStripButtonItemOptional.Checked = ((DocTemplateItem)this.dataGridViewConceptRules.SelectedRows[0].Tag).Optional; } @@ -338,10 +396,19 @@ private void dataGridViewConceptRules_CellValidated(object sender, DataGridViewC if (val != null) { DataGridViewColumn col = this.dataGridViewConceptRules.Columns[i]; - sb.Append(col.HeaderText); - sb.Append("="); - sb.Append(val as string); - sb.Append(";"); + if (col.Tag is DocModelRule) + { + DocModelRule rule = (DocModelRule)col.Tag; + + sb.Append(rule.Identification); + sb.Append("="); + sb.Append(val as string); + sb.Append(";"); + } + else + { + this.ToString(); // description??? + } } } @@ -388,7 +455,7 @@ private void dataGridViewConceptRules_CellContentClick(object sender, DataGridVi } else if (form.ValuePath == "") { - cell.Value = "\\"; + cell.Value = String.Empty;// "\\"; } dataGridViewConceptRules_CellValidated(this, e); this.dataGridViewConceptRules.NotifyCurrentCellDirty(true); @@ -432,6 +499,7 @@ private void dataGridViewConceptRules_CellContentClick(object sender, DataGridVi { form.Project = this.m_project; form.ConceptRoot = this.m_conceptroot; + form.ConceptItem = docConceptItem; form.ConceptLeaf = docConceptInner; form.CurrentInstance = this.m_instance; form.ShowDialog(this); @@ -465,14 +533,18 @@ private void toolStripButtonTemplateRemove_Click(object sender, EventArgs e) int index = this.dataGridViewConceptRules.SelectedRows[0].Index; DocTemplateUsage docUsage = (DocTemplateUsage)this.m_conceptleaf; docUsage.Items.RemoveAt(index); + this.m_editcon = false; LoadUsage(); + /* + this.m_editcon = true; if (this.dataGridViewConceptRules.Rows.Count > index) { this.dataGridViewConceptRules.Rows[index].Selected = true; } this.m_editcon = false; + */ } private void toolStripButtonMoveUp_Click(object sender, EventArgs e) @@ -575,5 +647,16 @@ private void toolStripButtonItemOptional_Click(object sender, EventArgs e) band.DefaultCellStyle.ForeColor = Color.Black; } } + + private void toolStripButtonShowFailures_Click(object sender, EventArgs e) + { + this.toolStripButtonShowFailures.Checked = !this.toolStripButtonShowFailures.Checked; + this.splitContainer1.Panel2Collapsed = !this.toolStripButtonShowFailures.Checked; + } + + private void toolStripComboBoxOperator_SelectedIndexChanged(object sender, EventArgs e) + { + this.m_conceptleaf.Operator = (DocTemplateOperator)this.toolStripComboBoxOperator.SelectedIndex; + } } } diff --git a/CtlParameters.resx b/CtlParameters.resx index 691a742e..2de3067c 100644 --- a/CtlParameters.resx +++ b/CtlParameters.resx @@ -163,45 +163,6 @@ wWBEnNMUvJlJCAbHY2yu9HLgskT5xRn09QE27b9P78jnfP9boCkITC4xNrFIYGKJPn9USHbWj1FS4aJ7 KCz2VTQFw6F5mdeFdQHXM0lIOvs/iW8VXx5NQX/w5z+jKShsrgd5Uqf7C6AcgeBP0yOcAAAAAElFTkSu QmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJkSURBVDhPjZPdS9NhFMd/IOHdIvBKiV2FBAbrziRaVFQk - uZfWlvY2Ldx0bdnKUrfayNaLzkQFscBIrS4sN6rV2pbuXdeLkQaFhRfWnf/Et3Oen+KcXXTgyw7P7/mc - 8z3PnkfKD2vk6D5LRBO6ENfDO22FK3MOnDcEqyc1/ioTbVGQisTmwmiOaPvbM/WYWBhG7k8M4V9P8exb - Hwa/eHEja4VlyoSDQ/sDtFVJKhbQajTFtKPu7HmklkLI/g4jtjiOwI+HeDzXhb7PLvhm7OSmHsaYATt7 - 1FFCyklyEbbtTNbhxfcHePNzDK8XRigfwuh8j+je/eEKjWPBtfRpXEoYoQ7rUWLYdpdQdlIkmd9pQrdy - TozMdePJ/H0BDn+9g8FZD/wfW9E5YxPdLydrcTFhQO17KtClXiT4EEkh6aJ63KMu/WR1YPY6/brR+6mN - 1pwEN8OdaUBr6qTo7ogfg50OtfSlFgQ7hIs9b3W4Od0k5rydc8BH4q6ebCM6MmaC69bBrK2vRAEeo0La - EdKhLX1GbHZRtw6y254+i6upU2T7BFoSx9fBrDLZQS9JJSmpmi1uhDNpEgCLcwZ5ZnsBzFIENGsFtowd - mTwc0Ysu+SqEVqWP6iB5di0TLI+wyVtl2hzUonHq30ChyoLUvbI0TbB8iBQKyb83UPIfRbbz4dlUS8QM - kOS/kYLvtlLq3B1VTGhwIKzbALJt0VmGH5HMgsl7F3wtyyUt3TAfXZLxGgGwip/X0MyVyyu2uTPDa1c5 - L3iBq7I1no8PiU+axTmv8beNjykv2BLPxZsqSKoVcc5rBc9Zkv4CrZmxDDZM2UkAAAAASUVORK5CYII= - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABhSURBVDhPvcxRCoBACIRhj+3xvJkl24bRKINBD3/Q7uwn - Iu7fOj+qOooCunsaqDY0YGYQeQDrBxcAQtb9dZiHXRkZAVF+8z+w9xCoQo9fQNUG0I4Gqg0NoPOIArpu - YJ77AU7OZbEmCy7WAAAAAElFTkSuQmCC - - - - - iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 - YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIaSURBVDhPpZNLSJRxFMVvOhEtjR4LF0UWLps2QS3atLAS - 3IbQwh4YtKlFQUhFYa0EFWvMxoLItJdlKVlaRpYgTg2Z5qsodR7O+PocJzOqxenc/zeRIx+D0OLHfAz3 - nHvP5X9FitoOSll3TKqHsCRK/XEpvH5KRFYTl6jY3RRC68gcgrO/8MX6ia7gPBoH46j2z6C4YwpHn0eR - 1xTGpvsBpNUOQ0p8PyjOtU3oeu1DDO3Dc/CF5tEZ+I6Wz99wuzeGCp+F0+2TONQSRc7jMDbcC8BVO2JP - InKGZBuDG+9nUN83a7o2DMRR1xPDlXcWLrL78bZx5DePYUdDCGvujmLZLU5gG5SSLcagpHManrcWvH4L - VRSWd00b8YmXEzjwLIK9jWFk1wewso7d/xmUEbcxOMnCsxz1/JspnHs9iaJXEzj2YhwFTyPIo3jrgyBW - 3Rm18zsZ7G+O4DBzHmmNopC/Bey678kYdjO3m+K1HN1kV7HiHUw22Ml8uqRcdttDdj0KYdvDIDZz6xns - nL5QrFxdZLCOHdZzw1kUbCSZ/FbhCmY2S1tM1UCygWbTLssp0FHTiKPwL5X9yQaORanw9P2HQc1XyOWF - Bvq2nQqduEmx9xPkQsdvihMPSQ9D37ZO4iW6YV1SJfEw66WPkApS3kt6IMUUb8/vpjjxlO2r0sPQP9RV - R0uF1mht4pjMSZoPdeNImislWqO11IjrD9oZIKigoGDDAAAAAElFTkSuQmCC @@ -253,6 +214,53 @@ W60B38hUojgHc9U4tHDuJ9KcJUavkcDfdnJbuqJ/kNyHacKJQp76M6MaduUcFl8lWlgT00rgz1K5KWVm U6teMfwkS42XOWpJ9HB5GhrSUlwZM2Qcm09msTKm+QO8wa4cjfvjIfGkmbzmPX7HNX+J4+BI3BcXqYi6 GHnNewm/syD8BvfA1J6LMQqMAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAJkSURBVDhPjZPdS9NhFMd/IOHdovBKiV2FBBZ2EyHRoqKi + yG2/1pb2Ni3cnG3VylK32mjZi85EBbHASK0uLDeq2dqW7l3Xi5EGhYUX1l3/xLdznl/inF104MsOz+/5 + nPM9z55Hyg9r5PBuS0QbOheX4Z2ywpU5A87rg4cmtP4qE21RkYrE5sKwRXS9rZk6jM0PIvcrhvCPJ3j6 + pQf9n7y4nrXCMmnCvoE9AdqqJhULaCkaY7phd/YsUoshZH+GEVsYReDbAzya7UDPRxfap+3kpg7GmAFb + uzRRQspJShG27UzW4vnX+xj/PoJX80OUD2B4rkt073x3mcax4Gr6JC4mjNCEZZQYNt4hlJ0USeY32tDN + nBNDs514PHdPgIOfb6N/xgP/+2b4pptE90vJGpxPGFDzVsb6Ds0CwftJKkkflXGXuvSS1b6Za/TrRveH + FlpzEmyDO1OP5tRx0d0RPwI7HWrpCx0IdggXO1/rcWOqUcx5K+dAO4m7erINaMuYCa5dAbM2vBQFeIwK + aXNIj5b0KbHZRd3ayG5r+jSupE6Q7WO4kDi6AmaVKQ66SZWSmqo1xY1wJk0CYHHOIM9sL4BZqoB2ucC6 + kYMTByKy6JKvQmhJclQPybPtN8HKCGu8Vaa1QR0aJv8NFKosSN23l6YJVg6RQiX5dwVK/qPIJj4825ZF + YvpIyt9IwXdbLfl2RFVjWuwN61eBbFt0VuCHJLNg8t4FX8tySUc3zEeXZLRaAKziZ9XKzIpt7szw8lXO + C17gqmyN5+ND4pNmcc5r/G31Y8oLtsRz8aYKUuVfcc5rBc9Zkv4Amuqw/U6vE/EAAAAASUVORK5CYII= + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABhSURBVDhPvcxRCoBACIRhj+3xvJkl24bRKINBD3/Q7uwn + Iu7fOj+qOooCunsaqDY0YGYQeQDrBxcAQtb9dZiHXRkZAVF+8z+w9xCoQo9fQNUG0I4Gqg0NoPOIArpu + YJ77AU7OZbEmCy7WAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIaSURBVDhPpZNLSJRxFMVvOhEtjR4LF0UWLps2ES3atLAS + 3IbQwh4YtKlFQUhFYa0EFWvMxoLItJdlKVlaRpYgTg2Z5qsodR7O+PocJzOqxenc/zeRIx+D0OLHfAz3 + nHvP5X9FitoOSll3TKqHsCRK/XEpvH5KRFYTl6jY3RRC68gcgrO/8MX6ia7gPBoH46j2z6C4YwpHn0eR + 1xTGpvsBpNUOQ0p8PyjOtU3oeu1DDO3Dc/CF5tEZ+I6Wz99wuzeGCp+F0+2TONQSRc7jMDbcC8BVO2JP + InKGZBuDG+9nUN83a7o2DMRR1xPDlXcWLrL78bZx5DePYUdDCGvujmLZLU5gG5SSLcagpHManrcWvH4L + VRSWd00b8YmXEzjwLIK9jWFk1wewso7d/xmUEbcxOMnCsxz1/JspnHs9iaJXEzj2YhwFTyPIo3jrgyBW + 3Rm18zsZ7G+O4DBzHmmNopC/Bey678kYdjO3m+K1HN1kV7HiHUw22Ml8uqRcdttDdj0KYdvDIDZz6xns + nL5QrFxdZLCOHdZzw1kUbCSZ/FbhCmY2S1tM1UCygWbTLssp0FHTiKPwL5X9yQaORanw9P2HQc1XyOWF + Bvq2nQqduEmx9xPkQsdvihMPSQ9D37ZO4iW6YV1SJfEw66WPkApS3kt6IMUUb8/vpjjxlO2r0sPQP9RV + R0uF1mht4pjMSZoPdeNImislWqO11IjrD9mMIKe4fA8OAAAAAElFTkSuQmCC + + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAABXSURBVDhPY1Da6POfEgw2oKKigiw8BAwAyRGSx2oATOOB + AwfAGMbHpg6nATDNyIZgU4dhADbNMIxNLfUNgEkQ0gxTR5tAhGFcGmGYoAGE8CAygHzs8x8Ad31kj3lG + aRgAAAAASUVORK5CYII= \ No newline at end of file diff --git a/CtlProperties.Designer.cs b/CtlProperties.Designer.cs index 81fb08aa..f5f34e3e 100644 --- a/CtlProperties.Designer.cs +++ b/CtlProperties.Designer.cs @@ -69,7 +69,9 @@ private void InitializeComponent() this.textBoxIdentityUuid = new System.Windows.Forms.TextBox(); this.label7 = new System.Windows.Forms.Label(); this.tabPageTemplate = new System.Windows.Forms.TabPage(); + this.ctlRules = new IfcDoc.CtlRules(); this.tabPageConcept = new System.Windows.Forms.TabPage(); + this.ctlParameters = new IfcDoc.CtlParameters(); this.tabPageRequirements = new System.Windows.Forms.TabPage(); this.groupBox2 = new System.Windows.Forms.GroupBox(); this.radioButtonExportNone = new System.Windows.Forms.RadioButton(); @@ -117,6 +119,9 @@ private void InitializeComponent() this.textBoxEntityBase = new System.Windows.Forms.TextBox(); this.label6 = new System.Windows.Forms.Label(); this.tabPageAttribute = new System.Windows.Forms.TabPage(); + this.checkBoxAttributeUnique = new System.Windows.Forms.CheckBox(); + this.textBoxAttributeDerived = new System.Windows.Forms.TextBox(); + this.label3 = new System.Windows.Forms.Label(); this.label28 = new System.Windows.Forms.Label(); this.label27 = new System.Windows.Forms.Label(); this.textBoxAttributeAggregationMax = new System.Windows.Forms.TextBox(); @@ -142,6 +147,11 @@ private void InitializeComponent() this.tabPageExpression = new System.Windows.Forms.TabPage(); this.textBoxExpression = new System.Windows.Forms.TextBox(); this.tabPageView = new System.Windows.Forms.TabPage(); + this.textBoxViewXsdNamespace = new System.Windows.Forms.TextBox(); + this.buttonViewEntity = new System.Windows.Forms.Button(); + this.textBoxViewRoot = new System.Windows.Forms.TextBox(); + this.labelViewEntity = new System.Windows.Forms.Label(); + this.checkBoxViewIncludeAll = new System.Windows.Forms.CheckBox(); this.listViewViewXsd = new System.Windows.Forms.ListView(); this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); @@ -184,6 +194,7 @@ private void InitializeComponent() this.buttonExampleClear = new System.Windows.Forms.Button(); this.buttonExampleLoad = new System.Windows.Forms.Button(); this.tabPageOperations = new System.Windows.Forms.TabPage(); + this.ctlOperators = new IfcDoc.CtlOperators(); this.tabPageConceptRoot = new System.Windows.Forms.TabPage(); this.listViewConceptRoot = new System.Windows.Forms.ListView(); this.columnHeaderRootTemplate = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); @@ -194,15 +205,18 @@ private void InitializeComponent() this.toolStripMenuItemModeInherit = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemModeOverride = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemModeSuppress = new System.Windows.Forms.ToolStripMenuItem(); + this.tabPageChange = new System.Windows.Forms.TabPage(); + this.listViewChange = new System.Windows.Forms.ListView(); + this.columnHeaderChangeAspect = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderChangeOld = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeaderChangeNew = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.toolStripChange = new System.Windows.Forms.ToolStrip(); + this.toolStripButtonChangeSPF = new System.Windows.Forms.ToolStripButton(); + this.toolStripButtonChangeXML = new System.Windows.Forms.ToolStripButton(); + this.toolStripComboBoxChange = new System.Windows.Forms.ToolStripComboBox(); this.imageListRules = new System.Windows.Forms.ImageList(this.components); this.openFileDialogIcon = new System.Windows.Forms.OpenFileDialog(); this.openFileDialogExample = new System.Windows.Forms.OpenFileDialog(); - this.label3 = new System.Windows.Forms.Label(); - this.textBoxAttributeDerived = new System.Windows.Forms.TextBox(); - this.checkBoxAttributeUnique = new System.Windows.Forms.CheckBox(); - this.ctlRules = new IfcDoc.CtlRules(); - this.ctlParameters = new IfcDoc.CtlParameters(); - this.ctlOperators = new IfcDoc.CtlOperators(); ((System.ComponentModel.ISupportInitialize)(this.splitContainerTranslation)).BeginInit(); this.splitContainerTranslation.Panel1.SuspendLayout(); this.splitContainerTranslation.Panel2.SuspendLayout(); @@ -230,6 +244,8 @@ private void InitializeComponent() this.tabPageOperations.SuspendLayout(); this.tabPageConceptRoot.SuspendLayout(); this.toolStrip1.SuspendLayout(); + this.tabPageChange.SuspendLayout(); + this.toolStripChange.SuspendLayout(); this.SuspendLayout(); // // splitContainerTranslation @@ -303,6 +319,7 @@ private void InitializeComponent() this.tabControl.Controls.Add(this.tabPageExample); this.tabControl.Controls.Add(this.tabPageOperations); this.tabControl.Controls.Add(this.tabPageConceptRoot); + this.tabControl.Controls.Add(this.tabPageChange); resources.ApplyResources(this.tabControl, "tabControl"); this.tabControl.Name = "tabControl"; this.tabControl.SelectedIndex = 0; @@ -532,6 +549,19 @@ private void InitializeComponent() this.tabPageTemplate.Name = "tabPageTemplate"; this.tabPageTemplate.UseVisualStyleBackColor = true; // + // ctlRules + // + this.ctlRules.Attribute = null; + this.ctlRules.BaseTemplate = null; + this.ctlRules.CurrentInstance = null; + resources.ApplyResources(this.ctlRules, "ctlRules"); + this.ctlRules.Name = "ctlRules"; + this.ctlRules.Project = null; + this.ctlRules.Selection = null; + this.ctlRules.Template = null; + this.ctlRules.SelectionChanged += new System.EventHandler(this.ctlRules_SelectionChanged); + this.ctlRules.ContentChanged += new System.EventHandler(this.ctlRules_ContentChanged); + // // tabPageConcept // this.tabPageConcept.Controls.Add(this.ctlParameters); @@ -539,6 +569,16 @@ private void InitializeComponent() this.tabPageConcept.Name = "tabPageConcept"; this.tabPageConcept.UseVisualStyleBackColor = true; // + // ctlParameters + // + this.ctlParameters.ConceptItem = null; + this.ctlParameters.ConceptLeaf = null; + this.ctlParameters.ConceptRoot = null; + this.ctlParameters.CurrentInstance = null; + resources.ApplyResources(this.ctlParameters, "ctlParameters"); + this.ctlParameters.Name = "ctlParameters"; + this.ctlParameters.Project = null; + // // tabPageRequirements // this.tabPageRequirements.Controls.Add(this.groupBox2); @@ -926,6 +966,24 @@ private void InitializeComponent() this.tabPageAttribute.Name = "tabPageAttribute"; this.tabPageAttribute.UseVisualStyleBackColor = true; // + // checkBoxAttributeUnique + // + resources.ApplyResources(this.checkBoxAttributeUnique, "checkBoxAttributeUnique"); + this.checkBoxAttributeUnique.Name = "checkBoxAttributeUnique"; + this.checkBoxAttributeUnique.UseVisualStyleBackColor = true; + this.checkBoxAttributeUnique.CheckedChanged += new System.EventHandler(this.checkBoxAttributeUnique_CheckedChanged); + // + // textBoxAttributeDerived + // + resources.ApplyResources(this.textBoxAttributeDerived, "textBoxAttributeDerived"); + this.textBoxAttributeDerived.Name = "textBoxAttributeDerived"; + this.textBoxAttributeDerived.TextChanged += new System.EventHandler(this.textBoxAttributeDerived_TextChanged); + // + // label3 + // + resources.ApplyResources(this.label3, "label3"); + this.label3.Name = "label3"; + // // label28 // resources.ApplyResources(this.label28, "label28"); @@ -1094,6 +1152,11 @@ private void InitializeComponent() // // tabPageView // + this.tabPageView.Controls.Add(this.textBoxViewXsdNamespace); + this.tabPageView.Controls.Add(this.buttonViewEntity); + this.tabPageView.Controls.Add(this.textBoxViewRoot); + this.tabPageView.Controls.Add(this.labelViewEntity); + this.tabPageView.Controls.Add(this.checkBoxViewIncludeAll); this.tabPageView.Controls.Add(this.listViewViewXsd); this.tabPageView.Controls.Add(this.comboBoxViewXsd); this.tabPageView.Controls.Add(this.checkBoxViewXsdTagless); @@ -1107,6 +1170,37 @@ private void InitializeComponent() this.tabPageView.Name = "tabPageView"; this.tabPageView.UseVisualStyleBackColor = true; // + // textBoxViewXsdNamespace + // + resources.ApplyResources(this.textBoxViewXsdNamespace, "textBoxViewXsdNamespace"); + this.textBoxViewXsdNamespace.Name = "textBoxViewXsdNamespace"; + this.textBoxViewXsdNamespace.TextChanged += new System.EventHandler(this.textBoxViewXsdNamespace_TextChanged); + // + // buttonViewEntity + // + resources.ApplyResources(this.buttonViewEntity, "buttonViewEntity"); + this.buttonViewEntity.Name = "buttonViewEntity"; + this.buttonViewEntity.UseVisualStyleBackColor = true; + this.buttonViewEntity.Click += new System.EventHandler(this.buttonViewEntity_Click); + // + // textBoxViewRoot + // + resources.ApplyResources(this.textBoxViewRoot, "textBoxViewRoot"); + this.textBoxViewRoot.Name = "textBoxViewRoot"; + this.textBoxViewRoot.ReadOnly = true; + // + // labelViewEntity + // + resources.ApplyResources(this.labelViewEntity, "labelViewEntity"); + this.labelViewEntity.Name = "labelViewEntity"; + // + // checkBoxViewIncludeAll + // + resources.ApplyResources(this.checkBoxViewIncludeAll, "checkBoxViewIncludeAll"); + this.checkBoxViewIncludeAll.Name = "checkBoxViewIncludeAll"; + this.checkBoxViewIncludeAll.UseVisualStyleBackColor = true; + this.checkBoxViewIncludeAll.CheckedChanged += new System.EventHandler(this.checkBoxViewIncludeAll_CheckedChanged); + // // listViewViewXsd // resources.ApplyResources(this.listViewViewXsd, "listViewViewXsd"); @@ -1633,6 +1727,16 @@ private void InitializeComponent() this.tabPageOperations.Name = "tabPageOperations"; this.tabPageOperations.UseVisualStyleBackColor = true; // + // ctlOperators + // + this.ctlOperators.CurrentInstance = null; + this.ctlOperators.CurrentPopulation = null; + resources.ApplyResources(this.ctlOperators, "ctlOperators"); + this.ctlOperators.Name = "ctlOperators"; + this.ctlOperators.Project = null; + this.ctlOperators.Rule = null; + this.ctlOperators.Template = null; + // // tabPageConceptRoot // this.tabPageConceptRoot.Controls.Add(this.listViewConceptRoot); @@ -1708,70 +1812,84 @@ private void InitializeComponent() this.toolStripMenuItemModeSuppress.Name = "toolStripMenuItemModeSuppress"; this.toolStripMenuItemModeSuppress.Click += new System.EventHandler(this.toolStripMenuItemModeSuppress_Click); // - // imageListRules + // tabPageChange // - this.imageListRules.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; - resources.ApplyResources(this.imageListRules, "imageListRules"); - this.imageListRules.TransparentColor = System.Drawing.Color.Fuchsia; + this.tabPageChange.Controls.Add(this.listViewChange); + this.tabPageChange.Controls.Add(this.toolStripChange); + resources.ApplyResources(this.tabPageChange, "tabPageChange"); + this.tabPageChange.Name = "tabPageChange"; + this.tabPageChange.UseVisualStyleBackColor = true; // - // openFileDialogIcon + // listViewChange // - resources.ApplyResources(this.openFileDialogIcon, "openFileDialogIcon"); + this.listViewChange.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeaderChangeAspect, + this.columnHeaderChangeOld, + this.columnHeaderChangeNew}); + resources.ApplyResources(this.listViewChange, "listViewChange"); + this.listViewChange.Name = "listViewChange"; + this.listViewChange.UseCompatibleStateImageBehavior = false; + this.listViewChange.View = System.Windows.Forms.View.Details; // - // openFileDialogExample + // columnHeaderChangeAspect // - this.openFileDialogExample.DefaultExt = "ifc"; - resources.ApplyResources(this.openFileDialogExample, "openFileDialogExample"); + resources.ApplyResources(this.columnHeaderChangeAspect, "columnHeaderChangeAspect"); // - // label3 + // columnHeaderChangeOld // - resources.ApplyResources(this.label3, "label3"); - this.label3.Name = "label3"; + resources.ApplyResources(this.columnHeaderChangeOld, "columnHeaderChangeOld"); // - // textBoxAttributeDerived + // columnHeaderChangeNew // - resources.ApplyResources(this.textBoxAttributeDerived, "textBoxAttributeDerived"); - this.textBoxAttributeDerived.Name = "textBoxAttributeDerived"; - this.textBoxAttributeDerived.TextChanged += new System.EventHandler(this.textBoxAttributeDerived_TextChanged); + resources.ApplyResources(this.columnHeaderChangeNew, "columnHeaderChangeNew"); // - // checkBoxAttributeUnique + // toolStripChange // - resources.ApplyResources(this.checkBoxAttributeUnique, "checkBoxAttributeUnique"); - this.checkBoxAttributeUnique.Name = "checkBoxAttributeUnique"; - this.checkBoxAttributeUnique.UseVisualStyleBackColor = true; - this.checkBoxAttributeUnique.CheckedChanged += new System.EventHandler(this.checkBoxAttributeUnique_CheckedChanged); + this.toolStripChange.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; + this.toolStripChange.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripButtonChangeSPF, + this.toolStripButtonChangeXML, + this.toolStripComboBoxChange}); + resources.ApplyResources(this.toolStripChange, "toolStripChange"); + this.toolStripChange.Name = "toolStripChange"; // - // ctlRules + // toolStripButtonChangeSPF // - this.ctlRules.Attribute = null; - this.ctlRules.BaseTemplate = null; - this.ctlRules.CurrentInstance = null; - resources.ApplyResources(this.ctlRules, "ctlRules"); - this.ctlRules.Name = "ctlRules"; - this.ctlRules.Project = null; - this.ctlRules.Selection = null; - this.ctlRules.Template = null; - this.ctlRules.SelectionChanged += new System.EventHandler(this.ctlRules_SelectionChanged); - this.ctlRules.ContentChanged += new System.EventHandler(this.ctlRules_ContentChanged); + this.toolStripButtonChangeSPF.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + resources.ApplyResources(this.toolStripButtonChangeSPF, "toolStripButtonChangeSPF"); + this.toolStripButtonChangeSPF.Name = "toolStripButtonChangeSPF"; // - // ctlParameters + // toolStripButtonChangeXML // - this.ctlParameters.ConceptLeaf = null; - this.ctlParameters.ConceptRoot = null; - this.ctlParameters.CurrentInstance = null; - resources.ApplyResources(this.ctlParameters, "ctlParameters"); - this.ctlParameters.Name = "ctlParameters"; - this.ctlParameters.Project = null; + this.toolStripButtonChangeXML.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text; + resources.ApplyResources(this.toolStripButtonChangeXML, "toolStripButtonChangeXML"); + this.toolStripButtonChangeXML.Name = "toolStripButtonChangeXML"; // - // ctlOperators + // toolStripComboBoxChange // - this.ctlOperators.CurrentInstance = null; - this.ctlOperators.CurrentPopulation = null; - resources.ApplyResources(this.ctlOperators, "ctlOperators"); - this.ctlOperators.Name = "ctlOperators"; - this.ctlOperators.Project = null; - this.ctlOperators.Rule = null; - this.ctlOperators.Template = null; + resources.ApplyResources(this.toolStripComboBoxChange, "toolStripComboBoxChange"); + this.toolStripComboBoxChange.Items.AddRange(new object[] { + resources.GetString("toolStripComboBoxChange.Items"), + resources.GetString("toolStripComboBoxChange.Items1"), + resources.GetString("toolStripComboBoxChange.Items2"), + resources.GetString("toolStripComboBoxChange.Items3"), + resources.GetString("toolStripComboBoxChange.Items4")}); + this.toolStripComboBoxChange.Name = "toolStripComboBoxChange"; + // + // imageListRules + // + this.imageListRules.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; + resources.ApplyResources(this.imageListRules, "imageListRules"); + this.imageListRules.TransparentColor = System.Drawing.Color.Fuchsia; + // + // openFileDialogIcon + // + resources.ApplyResources(this.openFileDialogIcon, "openFileDialogIcon"); + // + // openFileDialogExample + // + this.openFileDialogExample.DefaultExt = "ifc"; + resources.ApplyResources(this.openFileDialogExample, "openFileDialogExample"); // // CtlProperties // @@ -1826,6 +1944,10 @@ private void InitializeComponent() this.tabPageConceptRoot.PerformLayout(); this.toolStrip1.ResumeLayout(false); this.toolStrip1.PerformLayout(); + this.tabPageChange.ResumeLayout(false); + this.tabPageChange.PerformLayout(); + this.toolStripChange.ResumeLayout(false); + this.toolStripChange.PerformLayout(); this.ResumeLayout(false); } @@ -2005,5 +2127,19 @@ private void InitializeComponent() private System.Windows.Forms.TextBox textBoxAttributeDerived; private System.Windows.Forms.Label label3; private System.Windows.Forms.CheckBox checkBoxAttributeUnique; + private System.Windows.Forms.CheckBox checkBoxViewIncludeAll; + private System.Windows.Forms.Button buttonViewEntity; + private System.Windows.Forms.TextBox textBoxViewRoot; + private System.Windows.Forms.Label labelViewEntity; + private System.Windows.Forms.TextBox textBoxViewXsdNamespace; + private System.Windows.Forms.TabPage tabPageChange; + private System.Windows.Forms.ListView listViewChange; + private System.Windows.Forms.ColumnHeader columnHeaderChangeAspect; + private System.Windows.Forms.ColumnHeader columnHeaderChangeOld; + private System.Windows.Forms.ColumnHeader columnHeaderChangeNew; + private System.Windows.Forms.ToolStrip toolStripChange; + private System.Windows.Forms.ToolStripButton toolStripButtonChangeSPF; + private System.Windows.Forms.ToolStripButton toolStripButtonChangeXML; + private System.Windows.Forms.ToolStripComboBox toolStripComboBoxChange; } } diff --git a/CtlProperties.cs b/CtlProperties.cs index 21ee443c..16653f45 100644 --- a/CtlProperties.cs +++ b/CtlProperties.cs @@ -114,6 +114,9 @@ public void Init(DocObject[] path, DocProject docProject) this.tabControl.TabPages.Add(this.tabPageView); DocModelView docView = (DocModelView)docObject; + this.checkBoxViewIncludeAll.Checked = docView.IncludeAllDefinitions; + this.textBoxViewRoot.Text = docView.RootEntity; + if (docView.BaseView != null) { this.textBoxViewBase.Text = docView.BaseView; @@ -135,6 +138,7 @@ public void Init(DocObject[] path, DocProject docProject) this.textBoxViewBase.Text = string.Empty; } + this.textBoxViewXsdNamespace.Text = docView.XsdUri; if (docView.XsdFormats != null) { foreach (DocXsdFormat docFormat in docView.XsdFormats) @@ -186,6 +190,14 @@ public void Init(DocObject[] path, DocProject docProject) this.tabControl.TabPages.Add(this.tabPageUsage); this.listViewUsage.Items.Clear(); + + // usage from other templates + foreach(DocTemplateDefinition docTemp in this.m_project.Templates) + { + InitUsageFromTemplate(docTemp, docTemplate); + } + + // usage from model views foreach (DocModelView docView in this.m_project.ModelViews) { foreach (DocConceptRoot docRoot in docView.ConceptRoots) @@ -219,7 +231,11 @@ public void Init(DocObject[] path, DocProject docProject) this.tabControl.TabPages.Add(this.tabPageConceptRoot); DocConceptRoot docRoot = (DocConceptRoot)docObject; - DocEntity docEntity = (DocEntity)this.m_parent; + + //DocEntity docEntity = (DocEntity)this.m_parent; + + DocEntity docEntity = docRoot.ApplicableEntity; + DocModelView docView = null; foreach (DocModelView docViewEach in this.m_project.ModelViews) { @@ -302,6 +318,7 @@ public void Init(DocObject[] path, DocProject docProject) this.ctlParameters.Project = this.m_project; this.ctlParameters.ConceptRoot = this.m_path[3] as DocConceptRoot; + this.ctlParameters.ConceptItem = this.ctlParameters.ConceptRoot; this.ctlParameters.ConceptLeaf = docUsage; this.LoadModelView(); @@ -448,6 +465,47 @@ public void Init(DocObject[] path, DocProject docProject) this.checkedListBoxExampleViews.Items.Add(docView, (docExample.Views.Contains(docView))); } } + else if(docObject is DocChangeAction) + { + this.tabControl.TabPages.Add(this.tabPageChange); + DocChangeAction docChange = (DocChangeAction)docObject; + this.toolStripButtonChangeSPF.Checked = docChange.ImpactSPF; + this.toolStripButtonChangeXML.Checked = docChange.ImpactXML; + + switch(docChange.Action) + { + case DocChangeActionEnum.NOCHANGE: + this.toolStripComboBoxChange.SelectedIndex = 0; + break; + + case DocChangeActionEnum.ADDED: + this.toolStripComboBoxChange.SelectedIndex = 1; + break; + + case DocChangeActionEnum.DELETED: + this.toolStripComboBoxChange.SelectedIndex = 2; + break; + + case DocChangeActionEnum.MODIFIED: + this.toolStripComboBoxChange.SelectedIndex = 3; + break; + + case DocChangeActionEnum.MOVED: + this.toolStripComboBoxChange.SelectedIndex = 4; + break; + + } + + this.listViewChange.Items.Clear(); + foreach(DocChangeAspect docAspect in docChange.Aspects) + { + ListViewItem lvi = new ListViewItem(); + lvi.Text = docAspect.Aspect.ToString(); + lvi.SubItems.Add(docAspect.OldValue); + lvi.SubItems.Add(docAspect.NewValue); + this.listViewChange.Items.Add(lvi); + } + } if (tabpageExist != null && this.tabControl.TabPages.Contains(tabpageExist)) { @@ -457,6 +515,44 @@ public void Init(DocObject[] path, DocProject docProject) this.m_loadall = false; } + private void InitUsageFromTemplateRule(DocTemplateDefinition docTemp, DocTemplateDefinition docSource, DocModelRule docRule) + { + if (docRule is DocModelRuleEntity) + { + DocModelRuleEntity docRuleEntity = (DocModelRuleEntity)docRule; + if (docRuleEntity.References.Contains(docSource)) + { + DocObject[] usagepath = new DocObject[] { docTemp }; + + ListViewItem lvi = new ListViewItem(); + lvi.Tag = usagepath; + lvi.Text = "[Template]"; + lvi.SubItems.Add(docTemp.Name); + this.listViewUsage.Items.Add(lvi); + } + } + + // recurse + foreach(DocModelRule docInner in docRule.Rules) + { + InitUsageFromTemplateRule(docTemp, docSource, docInner); + } + } + + private void InitUsageFromTemplate(DocTemplateDefinition docTemp, DocTemplateDefinition docSource) + { + foreach (DocModelRule docRule in docTemp.Rules) + { + InitUsageFromTemplateRule(docTemp, docSource, docRule); + } + + // recurse + foreach(DocTemplateDefinition docSub in docTemp.Templates) + { + InitUsageFromTemplate(docSub, docSource); + } + } + public SEntity[] CurrentPopulation { get @@ -613,7 +709,7 @@ private void UpdateTreeRule(TreeNode tnRule) string tooltip = docRule.Name; // decorative text doesn't allow treeview path to work -- use tooltip in UI now instead - tooltip += docRule.GetCardinalityExpression(); + //tooltip += docRule.GetCardinalityExpression(); if (!String.IsNullOrEmpty(docRule.Identification)) { tooltip += " <" + docRule.Identification + ">"; @@ -1163,12 +1259,34 @@ private void buttonAttributeType_Click(object sender, EventArgs e) if (docAttr.Definition != null && docAttr.Definition.DiagramRectangle != null) { - docDef.DiagramRectangle = new DocRectangle(); - docDef.DiagramNumber = docAttr.Definition.DiagramNumber; - docDef.DiagramRectangle.X = docAttr.Definition.DiagramRectangle.X; - docDef.DiagramRectangle.Y = docAttr.Definition.DiagramRectangle.Y; - docDef.DiagramRectangle.Width = docAttr.Definition.DiagramRectangle.Width; - docDef.DiagramRectangle.Height = docAttr.Definition.DiagramRectangle.Height; + // find page target, make page reference + if(docDef is DocDefinitionRef) + { + DocDefinitionRef ddr = (DocDefinitionRef)docDef; + + // find existing page target + foreach(DocPageTarget docPageTarget in docSchema.PageTargets) + { + if(docPageTarget.Definition == ddr) + { + // found it -- make page source + DocPageSource docPageSource = new DocPageSource(); + docPageTarget.Sources.Add(docPageSource); + docDef = docPageSource; + break; + } + } + } + + if (docDef.DiagramRectangle == null) + { + docDef.DiagramRectangle = new DocRectangle(); + docDef.DiagramNumber = docAttr.Definition.DiagramNumber; + docDef.DiagramRectangle.X = docAttr.Definition.DiagramRectangle.X; + docDef.DiagramRectangle.Y = docAttr.Definition.DiagramRectangle.Y; + docDef.DiagramRectangle.Width = docAttr.Definition.DiagramRectangle.Width; + docDef.DiagramRectangle.Height = docAttr.Definition.DiagramRectangle.Height; + } } docAttr.Definition = docDef; @@ -1548,10 +1666,17 @@ private void buttonUsageMigrate_Click(object sender, EventArgs e) { ListViewItem lvi = this.listViewUsage.SelectedItems[0]; DocObject[] path = (DocObject[])lvi.Tag; - DocTemplateUsage usage = (DocTemplateUsage)path[2]; - usage.Definition = form.SelectedTemplate; + if (path.Length == 3) + { + DocTemplateUsage usage = (DocTemplateUsage)path[2]; + usage.Definition = form.SelectedTemplate; - lvi.Remove(); + lvi.Remove(); + } + else + { + return; + } } } } @@ -1560,7 +1685,20 @@ private void buttonUsageMigrate_Click(object sender, EventArgs e) private void listViewUsage_SelectedIndexChanged(object sender, EventArgs e) { this.toolStripButtonUsageNavigate.Enabled = (this.listViewUsage.SelectedItems.Count == 1); - this.toolStripButtonUsageMigrate.Enabled = (this.listViewUsage.SelectedItems.Count > 0); + + bool migrate = false; + if (this.listViewUsage.SelectedItems.Count > 0) + { + migrate = true; + foreach(ListViewItem lvi in this.listViewUsage.SelectedItems) + { + if(lvi.Text.Equals("[Template]")) + { + migrate = false; + } + } + } + this.toolStripButtonUsageMigrate.Enabled = migrate; } private void comboBoxExchangeClassProcess_Validated(object sender, EventArgs e) @@ -2204,6 +2342,39 @@ private void textBoxAttributeDerived_TextChanged(object sender, EventArgs e) } } + private void checkBoxViewIncludeAll_CheckedChanged(object sender, EventArgs e) + { + DocModelView docView = (DocModelView)this.m_target; + docView.IncludeAllDefinitions = this.checkBoxViewIncludeAll.Checked; + } + + private void buttonViewEntity_Click(object sender, EventArgs e) + { + DocModelView docView = (DocModelView)this.m_target; + using(FormSelectEntity form = new FormSelectEntity(null, null, this.m_project, SelectDefinitionOptions.Entity)) + { + if(form.ShowDialog(this) == DialogResult.OK) + { + if (form.SelectedEntity != null) + { + docView.RootEntity = form.SelectedEntity.Name; + } + else + { + docView.RootEntity = null; + } + } + } + + this.textBoxViewRoot.Text = docView.RootEntity; + } + + private void textBoxViewXsdNamespace_TextChanged(object sender, EventArgs e) + { + DocModelView docView = (DocModelView)this.m_target; + docView.XsdUri = this.textBoxViewXsdNamespace.Text; + } + } } diff --git a/CtlProperties.resx b/CtlProperties.resx index 2064ff6f..5cf2328d 100644 --- a/CtlProperties.resx +++ b/CtlProperties.resx @@ -1105,7 +1105,7 @@ ctlRules - IfcDoc.CtlRules, IfcDoc, Version=8.8.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.CtlRules, IfcDoc, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null tabPageTemplate @@ -1156,7 +1156,7 @@ ctlParameters - IfcDoc.CtlParameters, IfcDoc, Version=8.7.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.CtlParameters, IfcDoc, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null tabPageConcept @@ -3195,6 +3195,141 @@ 10 + + Top, Left, Right + + + 7, 151 + + + 331, 20 + + + 29 + + + textBoxViewXsdNamespace + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageView + + + 0 + + + Top, Right + + + NoControl + + + 263, 66 + + + 75, 23 + + + 28 + + + Select... + + + buttonViewEntity + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageView + + + 1 + + + Top, Left, Right + + + 7, 68 + + + 250, 20 + + + 27 + + + textBoxViewRoot + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageView + + + 2 + + + True + + + NoControl + + + 6, 51 + + + 244, 13 + + + 26 + + + Base Entity: (shown as root in inheritance diagram) + + + labelViewEntity + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageView + + + 3 + + + True + + + 6, 103 + + + 221, 17 + + + 25 + + + Include all schema definitions (no filtering) + + + checkBoxViewIncludeAll + + + System.Windows.Forms.CheckBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageView + + + 4 + Top, Bottom, Left, Right @@ -3211,10 +3346,10 @@ Tagless - 7, 74 + 7, 177 - 331, 276 + 331, 173 24 @@ -3229,7 +3364,7 @@ tabPageView - 0 + 5 Bottom, Right @@ -3274,7 +3409,7 @@ tabPageView - 1 + 6 Bottom, Right @@ -3307,7 +3442,7 @@ tabPageView - 2 + 7 Bottom, Left @@ -3340,7 +3475,7 @@ tabPageView - 3 + 8 Bottom, Left @@ -3370,7 +3505,7 @@ tabPageView - 4 + 9 True @@ -3379,16 +3514,16 @@ NoControl - 6, 57 + 6, 133 - 119, 13 + 92, 13 14 - XSD Tag Configuration: + XML Namespace: label29 @@ -3400,7 +3535,7 @@ tabPageView - 5 + 10 Top, Right @@ -3430,7 +3565,7 @@ tabPageView - 6 + 11 Top, Left, Right @@ -3454,7 +3589,7 @@ tabPageView - 7 + 12 True @@ -3466,13 +3601,13 @@ 6, 9 - 60, 13 + 251, 13 10 - Base View: + Base View: (definitions are included from base view) label19 @@ -3484,7 +3619,7 @@ tabPageView - 8 + 13 4, 22 @@ -4428,9 +4563,6 @@ 8 - - Top, Right - NoControl @@ -4458,9 +4590,6 @@ 9 - - Top, Right - NoControl @@ -4922,7 +5051,7 @@ ctlOperators - IfcDoc.CtlOperators, IfcDoc, Version=8.7.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.CtlOperators, IfcDoc, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null tabPageOperations @@ -4992,7 +5121,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABy - CwAAAk1TRnQBSQFMAgEBBAEAAXQBAAF0AQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CwAAAk1TRnQBSQFMAgEBBAEAAZwBAAGcAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -5190,6 +5319,177 @@ 16 + + Aspect + + + 120 + + + Old Value + + + 120 + + + New Value + + + 120 + + + Fill + + + 3, 28 + + + 346, 363 + + + 0 + + + listViewChange + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageChange + + + 0 + + + 1043, 17 + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + Magenta + + + 30, 22 + + + SPF + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAIDSURBVDhPpZLrS5NhGMb3j4SWh0oRQVExD4gonkDpg4hG + YKxG6WBogkMZKgPNCEVJFBGdGETEvgwyO9DJE5syZw3PIlPEE9pgBCLZ5XvdMB8Ew8gXbl54nuf63dd9 + 0OGSnwCahxbPRNPAPMw9Xpg6ZmF46kZZ0xSKzJPIrhpDWsVnpBhGkKx3nAX8Pv7z1zg8OoY/cITdn4fw + bf/C0kYAN3Ma/w3gWfZL5kzTKBxjWyK2DftwI9tyMYCZKXbNHaD91bLYJrDXsYbrWfUKwJrPE9M2M1Oc + VzOOpHI7Jr376Hi9ogHqFIANO0/MmmmbmSmm9a8ze+I4MrNWAdjtoJgWcx+PSzg166yZZ8xM8XvXDix9 + c4jIqFYAjoriBV9AhEPv1mH/sonogha0afbZMMZz+yreTGyhpusHwtNNCsA5U1zS4BLxzJIfg299qO32 + Ir7UJtZfftyATqeT+8o2D8JSjQrAJblrncYL7ZJ2+bfaFnC/1S1NjL3diRat7qrO7wLRP3HjWsojBeCo + mDEo5mNjuweFGvjWg2EBhCbpkW78htSHHwRyNdmgAFzPEee2iFkzayy2OLXzT4gr6UdUnlXrullsxxQ+ + kx0g8BTA3aZlButjSTyjODq/WcQcW/B/Je4OQhLvKQDnzN1mp0nnkvAhR8VuMzNrpm1mpjgkoVwB/v8D + TgDQASA1MVpwzwAAAABJRU5ErkJggg== + + + + Magenta + + + 35, 22 + + + XML + + + False + + + NOCHANGE + + + ADDED + + + DELETED + + + MODIFIED + + + MOVED + + + 121, 25 + + + 3, 3 + + + 346, 25 + + + 1 + + + toolStrip3 + + + toolStripChange + + + System.Windows.Forms.ToolStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPageChange + + + 1 + + + 4, 22 + + + 3, 3, 3, 3 + + + 352, 394 + + + 19 + + + Change + + + tabPageChange + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl + + + 17 + Fill @@ -5433,6 +5733,42 @@ System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + columnHeaderChangeAspect + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + columnHeaderChangeOld + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + columnHeaderChangeNew + + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripButtonChangeSPF + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripButtonChangeXML + + + System.Windows.Forms.ToolStripButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripComboBoxChange + + + System.Windows.Forms.ToolStripComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + imageListRules diff --git a/CtlRules.cs b/CtlRules.cs index b3fbd90e..612ce74c 100644 --- a/CtlRules.cs +++ b/CtlRules.cs @@ -231,7 +231,7 @@ private void UpdateTemplateGraph(TreeNode tnRule) string tooltip = docRule.Name; // decorative text doesn't allow treeview path to work -- use tooltip in UI now instead - tooltip += docRule.GetCardinalityExpression(); + //tooltip += docRule.GetCardinalityExpression(); if (!String.IsNullOrEmpty(docRule.Identification)) { tooltip += " <" + docRule.Identification + ">"; @@ -675,6 +675,13 @@ private void toolStripButtonRuleRef_Click(object sender, EventArgs e) { if (form.ShowDialog(this) == DialogResult.OK && form.SelectedTemplate != null) { + // check for possible recursion + if(form.SelectedTemplate == this.m_template || form.SelectedTemplate.IsTemplateReferenced(this.m_template)) + { + MessageBox.Show("Recursive template referencing is not supported."); + return; + } + docRule.References.Add(form.SelectedTemplate); LoadTemplateGraph(tnSelect, docRule); diff --git a/DifferenceEngine.cs b/DifferenceEngine.cs new file mode 100644 index 00000000..ffefc87b --- /dev/null +++ b/DifferenceEngine.cs @@ -0,0 +1,602 @@ +// This code originated from: +// http://www.codeproject.com/Articles/6943/A-Generic-Reusable-Diff-Algorithm-in-C-II +// and has been slightly modified and combined into one file. +// License: public domain + +using System; +using System.Collections; +using System.IO; + +namespace DifferenceEngine +{ + public interface IDiffList + { + int Count(); + IComparable GetByIndex(int index); + } + + internal enum DiffStatus + { + Matched = 1, + NoMatch = -1, + Unknown = -2 + + } + + internal class DiffState + { + private const int BAD_INDEX = -1; + private int _startIndex; + private int _length; + + public int StartIndex { get { return _startIndex; } } + public int EndIndex { get { return ((_startIndex + _length) - 1); } } + public int Length + { + get + { + int len; + if (_length > 0) + { + len = _length; + } + else + { + if (_length == 0) + { + len = 1; + } + else + { + len = 0; + } + } + return len; + } + } + public DiffStatus Status + { + get + { + DiffStatus stat; + if (_length > 0) + { + stat = DiffStatus.Matched; + } + else + { + switch (_length) + { + case -1: + stat = DiffStatus.NoMatch; + break; + default: + System.Diagnostics.Debug.Assert(_length == -2, "Invalid status: _length < -2"); + stat = DiffStatus.Unknown; + break; + } + } + return stat; + } + } + + public DiffState() + { + SetToUnkown(); + } + + protected void SetToUnkown() + { + _startIndex = BAD_INDEX; + _length = (int)DiffStatus.Unknown; + } + + public void SetMatch(int start, int length) + { + System.Diagnostics.Debug.Assert(length > 0, "Length must be greater than zero"); + System.Diagnostics.Debug.Assert(start >= 0, "Start must be greater than or equal to zero"); + _startIndex = start; + _length = length; + } + + public void SetNoMatch() + { + _startIndex = BAD_INDEX; + _length = (int)DiffStatus.NoMatch; + } + + + public bool HasValidLength(int newStart, int newEnd, int maxPossibleDestLength) + { + if (_length > 0) //have unlocked match + { + if ((maxPossibleDestLength < _length) || + ((_startIndex < newStart) || (EndIndex > newEnd))) + { + SetToUnkown(); + } + } + return (_length != (int)DiffStatus.Unknown); + } + } + + internal class DiffStateList + { +#if USE_HASH_TABLE + private Hashtable _table; +#else + private DiffState[] _array; +#endif + public DiffStateList(int destCount) + { +#if USE_HASH_TABLE + _table = new Hashtable(Math.Max(9,destCount/10)); +#else + _array = new DiffState[destCount]; +#endif + } + + public DiffState GetByIndex(int index) + { +#if USE_HASH_TABLE + DiffState retval = (DiffState)_table[index]; + if (retval == null) + { + retval = new DiffState(); + _table.Add(index,retval); + } +#else + DiffState retval = _array[index]; + if (retval == null) + { + retval = new DiffState(); + _array[index] = retval; + } +#endif + return retval; + } + } + + + public enum DiffResultSpanStatus + { + NoChange, + Replace, + DeleteSource, + AddDestination + } + + public class DiffResultSpan : IComparable + { + private const int BAD_INDEX = -1; + private int _destIndex; + private int _sourceIndex; + private int _length; + private DiffResultSpanStatus _status; + + public int DestIndex { get { return _destIndex; } } + public int SourceIndex { get { return _sourceIndex; } } + public int Length { get { return _length; } } + public DiffResultSpanStatus Status { get { return _status; } } + + protected DiffResultSpan( + DiffResultSpanStatus status, + int destIndex, + int sourceIndex, + int length) + { + _status = status; + _destIndex = destIndex; + _sourceIndex = sourceIndex; + _length = length; + } + + public static DiffResultSpan CreateNoChange(int destIndex, int sourceIndex, int length) + { + return new DiffResultSpan(DiffResultSpanStatus.NoChange, destIndex, sourceIndex, length); + } + + public static DiffResultSpan CreateReplace(int destIndex, int sourceIndex, int length) + { + return new DiffResultSpan(DiffResultSpanStatus.Replace, destIndex, sourceIndex, length); + } + + public static DiffResultSpan CreateDeleteSource(int sourceIndex, int length) + { + return new DiffResultSpan(DiffResultSpanStatus.DeleteSource, BAD_INDEX, sourceIndex, length); + } + + public static DiffResultSpan CreateAddDestination(int destIndex, int length) + { + return new DiffResultSpan(DiffResultSpanStatus.AddDestination, destIndex, BAD_INDEX, length); + } + + public void AddLength(int i) + { + _length += i; + } + + public override string ToString() + { + return string.Format("{0} (Dest: {1},Source: {2}) {3}", + _status.ToString(), + _destIndex.ToString(), + _sourceIndex.ToString(), + _length.ToString()); + } + #region IComparable Members + + public int CompareTo(object obj) + { + return _destIndex.CompareTo(((DiffResultSpan)obj)._destIndex); + } + + #endregion + } + + public enum DiffEngineLevel + { + FastImperfect, + Medium, + SlowPerfect + } + + public class DiffEngine + { + private IDiffList _source; + private IDiffList _dest; + private ArrayList _matchList; + + private DiffEngineLevel _level; + + private DiffStateList _stateList; + + public DiffEngine() + { + _source = null; + _dest = null; + _matchList = null; + _stateList = null; + _level = DiffEngineLevel.FastImperfect; + } + + private int GetSourceMatchLength(int destIndex, int sourceIndex, int maxLength) + { + int matchCount; + for (matchCount = 0; matchCount < maxLength; matchCount++) + { + if ( _dest.GetByIndex(destIndex + matchCount).CompareTo(_source.GetByIndex(sourceIndex + matchCount)) != 0 ) + { + break; + } + } + return matchCount; + } + + private void GetLongestSourceMatch(DiffState curItem, int destIndex,int destEnd, int sourceStart,int sourceEnd) + { + + int maxDestLength = (destEnd - destIndex) + 1; + int curLength = 0; + int curBestLength = 0; + int curBestIndex = -1; + int maxLength = 0; + for (int sourceIndex = sourceStart; sourceIndex <= sourceEnd; sourceIndex++) + { + maxLength = Math.Min(maxDestLength,(sourceEnd - sourceIndex) + 1); + if (maxLength <= curBestLength) + { + //No chance to find a longer one any more + break; + } + curLength = GetSourceMatchLength(destIndex,sourceIndex,maxLength); + if (curLength > curBestLength) + { + //This is the best match so far + curBestIndex = sourceIndex; + curBestLength = curLength; + } + //jump over the match + sourceIndex += curBestLength; + } + //DiffState cur = _stateList.GetByIndex(destIndex); + if (curBestIndex == -1) + { + curItem.SetNoMatch(); + } + else + { + curItem.SetMatch(curBestIndex, curBestLength); + } + + } + + private void ProcessRange(int destStart, int destEnd, int sourceStart, int sourceEnd) + { + int curBestIndex = -1; + int curBestLength = -1; + int maxPossibleDestLength = 0; + DiffState curItem = null; + DiffState bestItem = null; + for (int destIndex = destStart; destIndex <= destEnd; destIndex++) + { + maxPossibleDestLength = (destEnd - destIndex) + 1; + if (maxPossibleDestLength <= curBestLength) + { + //we won't find a longer one even if we looked + break; + } + curItem = _stateList.GetByIndex(destIndex); + + if (!curItem.HasValidLength(sourceStart, sourceEnd, maxPossibleDestLength)) + { + //recalc new best length since it isn't valid or has never been done. + GetLongestSourceMatch(curItem, destIndex, destEnd, sourceStart, sourceEnd); + } + if (curItem.Status == DiffStatus.Matched) + { + switch (_level) + { + case DiffEngineLevel.FastImperfect: + if (curItem.Length > curBestLength) + { + //this is longest match so far + curBestIndex = destIndex; + curBestLength = curItem.Length; + bestItem = curItem; + } + //Jump over the match + destIndex += curItem.Length - 1; + break; + case DiffEngineLevel.Medium: + if (curItem.Length > curBestLength) + { + //this is longest match so far + curBestIndex = destIndex; + curBestLength = curItem.Length; + bestItem = curItem; + //Jump over the match + destIndex += curItem.Length - 1; + } + break; + default: + if (curItem.Length > curBestLength) + { + //this is longest match so far + curBestIndex = destIndex; + curBestLength = curItem.Length; + bestItem = curItem; + } + break; + } + } + } + if (curBestIndex < 0) + { + //we are done - there are no matches in this span + } + else + { + + int sourceIndex = bestItem.StartIndex; + _matchList.Add(DiffResultSpan.CreateNoChange(curBestIndex,sourceIndex,curBestLength)); + if (destStart < curBestIndex) + { + //Still have more lower destination data + if (sourceStart < sourceIndex) + { + //Still have more lower source data + // Recursive call to process lower indexes + ProcessRange(destStart, curBestIndex -1,sourceStart, sourceIndex -1); + } + } + int upperDestStart = curBestIndex + curBestLength; + int upperSourceStart = sourceIndex + curBestLength; + if (destEnd > upperDestStart) + { + //we still have more upper dest data + if (sourceEnd > upperSourceStart) + { + //set still have more upper source data + // Recursive call to process upper indexes + ProcessRange(upperDestStart,destEnd,upperSourceStart,sourceEnd); + } + } + } + } + + public double ProcessDiff(IDiffList source, IDiffList destination,DiffEngineLevel level) + { + _level = level; + return ProcessDiff(source,destination); + } + + public double ProcessDiff(IDiffList source, IDiffList destination) + { + DateTime dt = DateTime.Now; + _source = source; + _dest = destination; + _matchList = new ArrayList(); + + int dcount = _dest.Count(); + int scount = _source.Count(); + + + if ((dcount > 0)&&(scount > 0)) + { + _stateList = new DiffStateList(dcount); + ProcessRange(0,dcount - 1,0, scount - 1); + } + + TimeSpan ts = DateTime.Now - dt; + return ts.TotalSeconds; + } + + + private bool AddChanges( + ArrayList report, + int curDest, + int nextDest, + int curSource, + int nextSource) + { + bool retval = false; + int diffDest = nextDest - curDest; + int diffSource = nextSource - curSource; + int minDiff = 0; + if (diffDest > 0) + { + if (diffSource > 0) + { + minDiff = Math.Min(diffDest,diffSource); + report.Add(DiffResultSpan.CreateReplace(curDest,curSource,minDiff)); + if (diffDest > diffSource) + { + curDest+=minDiff; + report.Add(DiffResultSpan.CreateAddDestination(curDest,diffDest - diffSource)); + } + else + { + if (diffSource > diffDest) + { + curSource+= minDiff; + report.Add(DiffResultSpan.CreateDeleteSource(curSource,diffSource - diffDest)); + } + } + } + else + { + report.Add(DiffResultSpan.CreateAddDestination(curDest,diffDest)); + } + retval = true; + } + else + { + if (diffSource > 0) + { + report.Add(DiffResultSpan.CreateDeleteSource(curSource,diffSource)); + retval = true; + } + } + return retval; + } + + public ArrayList DiffReport() + { + ArrayList retval = new ArrayList(); + int dcount = _dest.Count(); + int scount = _source.Count(); + + //Deal with the special case of empty files + if (dcount == 0) + { + if (scount > 0) + { + retval.Add(DiffResultSpan.CreateDeleteSource(0,scount)); + } + return retval; + } + else + { + if (scount == 0) + { + retval.Add(DiffResultSpan.CreateAddDestination(0,dcount)); + return retval; + } + } + + + _matchList.Sort(); + int curDest = 0; + int curSource = 0; + DiffResultSpan last = null; + + //Process each match record + foreach (DiffResultSpan drs in _matchList) + { + if ((!AddChanges(retval,curDest,drs.DestIndex,curSource,drs.SourceIndex))&& + (last != null)) + { + last.AddLength(drs.Length); + } + else + { + retval.Add(drs); + } + curDest = drs.DestIndex + drs.Length; + curSource = drs.SourceIndex + drs.Length; + last = drs; + } + + //Process any tail end data + AddChanges(retval,curDest,dcount,curSource,scount); + + return retval; + } + } + + public class TextLine : IComparable + { + public string Line; + public int _hash; + + public TextLine(string str) + { + Line = str.Replace("\t", " "); + _hash = str.GetHashCode(); + } + #region IComparable Members + + public int CompareTo(object obj) + { + return _hash.CompareTo(((TextLine)obj)._hash); + } + + #endregion + } + + + public class DiffList_TextString : IDiffList + { + private const int MaxLineLength = 4096;//1024; + private ArrayList _lines; + + public DiffList_TextString(string content) + { + _lines = new ArrayList(); + if (content != null) + { + using (StringReader sr = new StringReader(content)) + { + String line; + // Read and display lines from the file until the end of + // the file is reached. + while ((line = sr.ReadLine()) != null) + { + if (line.Length > MaxLineLength) + { + throw new InvalidOperationException( + string.Format("File contains a line greater than {0} characters.", + MaxLineLength.ToString())); + } + _lines.Add(new TextLine(line)); + } + } + } + } + #region IDiffList Members + + public int Count() + { + return _lines.Count; + } + + public IComparable GetByIndex(int index) + { + return (TextLine)_lines[index]; + } + + #endregion + + } +} diff --git a/DocumentationISO.cs b/DocumentationISO.cs index 55ee1f15..b8725d59 100644 --- a/DocumentationISO.cs +++ b/DocumentationISO.cs @@ -44,16 +44,10 @@ public ContentRef(string caption, DocObject page) /// Optional filter of views to export. /// Optional filter of schemas to export. /// Optional filter of locales to export. - /// If true, appends .txt extension and generates formatted htm file for documentation purposes. - public static void DoExport(DocProject docProject, string filepath, DocModelView[] views, string[] locales, Dictionary instances, bool formatted) + public static void DoExport(DocProject docProject, string filepath, DocModelView[] views, string[] locales, Dictionary instances) { string ext = System.IO.Path.GetExtension(filepath).ToLower(); - if (formatted) - { - filepath = filepath + ".txt"; - } - Dictionary included = null; if (views != null) { @@ -309,6 +303,14 @@ private static string FormatExchange(DocProject docProject, DocModelView docView // format content StringBuilder sb = new StringBuilder(); + if(!String.IsNullOrEmpty(def.ExchangeClass)) + { + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine(""); + sb.AppendLine("
ProcessSenderReceiver
" + def.ExchangeClass + "" + def.SenderClass + "" + def.ReceiverClass + "
"); + } + // 1. manual content sb.Append(def.Documentation); @@ -370,6 +372,7 @@ private static string FormatExchange(DocProject docProject, DocModelView docView if (reqImport != DocExchangeRequirementEnum.NotRelevant || reqExport != DocExchangeRequirementEnum.NotRelevant) { +#if false sb.Append("  "); sb.Append(docConcept.Definition.Name); sb.Append(""); +#endif + sb.Append("  "); + sb.Append(docConcept.Definition.Name); + sb.Append(""); bool first = true; if (docConcept.Definition.Rules != null) @@ -1098,10 +1107,11 @@ public static string MakeLinkName(DocObject docobj) /// /// If matching figure exists, generates HTML including the figure and increments the figure count. /// + /// The project /// Object for which to find figure. /// Optional template for which to find figure. /// Caption of definition used in determining figure caption, e.g. 'Beam' - /// Number of figure; will be incremented if figure is found. + /// List of figures for determining numbering; appended as applicable by function. /// private static string FormatFigure(DocProject docProject, DocObject definition, DocTemplateDefinition dtd, string caption, List listFigures) { @@ -1273,6 +1283,7 @@ private static string FormatConceptTable( if (docConceptInner != null) { string inner = FormatConceptTable(docProject, docModelView, (DocEntity)docDef, root, docConceptInner, mapEntity, mapSchema); + sb.Append("" + docTemplateInner.Name + "
"); sb.Append(inner); } @@ -1283,6 +1294,11 @@ private static string FormatConceptTable( if (docTemplateInner == null && value != null && mapSchema.TryGetValue(value, out schema)) { + if(value.StartsWith("Pset_")) + { + value.ToString(); + } + sb.Append(" mapEntity, Dictionary mapSchema, Dictionary typemap, + List listFigures, + List listTables, FormatHTM htmTOC, FormatHTM htmSectionTOC ) @@ -1591,7 +1610,7 @@ FormatHTM htmSectionTOC using (FormatHTM htmExample = new FormatHTM(pathExample, mapEntity, mapSchema, included)) { htmExample.WriteHeader(docExample.Name, 2); - htmExample.WriteScript(-5, 1, 0, 0); + htmExample.WriteScript(-5, indexpath[0], 0, 0); htmExample.WriteLine("

" + indexpathstring + " " + docExample.Name + "

"); // table of files @@ -1636,8 +1655,10 @@ FormatHTM htmSectionTOC } } + docExample.Documentation = UpdateNumbering(docExample.Documentation, listFigures, listTables, docExample); + htmExample.WriteDocumentationForISO(docExample.Documentation, docExample, false); - htmExample.WriteLine("

\"Link  Link to this page

"); + htmExample.WriteLinkTo(docExample); htmExample.WriteFooter(Properties.Settings.Default.Footer); } @@ -1727,7 +1748,12 @@ FormatHTM htmSectionTOC string urlExample = "annex-e/" + MakeLinkName(docExample) + ".htm"; htmTOC.WriteTOC(2, "" + indexpathstring + " " + docExample.Name + ""); - string htmllink = "" + docExample.Name + ""; + string linkid = ""; + if(indexpath.Count == 1) + { + linkid = indexpath[0].ToString(); + } + string htmllink = "" + docExample.Name + ""; htmSectionTOC.WriteLine("" + indexpathstring + " " + htmllink + ""); if (docExample.Examples.Count > 0) @@ -1735,7 +1761,7 @@ FormatHTM htmSectionTOC indexpath.Add(0); foreach(DocExample docSub in docExample.Examples) { - GenerateExample(docSub, listFormats, path, indexpath, included, mapEntity, mapSchema, typemap, htmTOC, htmSectionTOC); + GenerateExample(docSub, listFormats, path, indexpath, included, mapEntity, mapSchema, typemap, listFigures, listTables, htmTOC, htmSectionTOC); } indexpath.RemoveAt(indexpath.Count - 1); } @@ -1818,7 +1844,7 @@ private static void GenerateTemplate( } // write url for incoming page link - htmTemplate.WriteLine("

\"Link  Link to this page

"); + htmTemplate.WriteLinkTo(docTemplate); htmTemplate.WriteFooter(Properties.Settings.Default.Footer); } @@ -1859,8 +1885,6 @@ private static string FormatEntityConcepts( List listFigures, List listTables) { - DocTemplateDefinition dtd = null; - StringBuilder sb = new StringBuilder(); // find concepts for entity @@ -1878,54 +1902,6 @@ private static string FormatEntityConcepts( } } - if (hasConceptsAtEntity) - { - sb.AppendLine("
"); - sb.AppendLine("
Definitions applying to " + docView.Name + "
"); - - // link to instance diagram - string linkdiagram = MakeLinkName(docView) + "/" + MakeLinkName(entity) + ".htm"; - sb.Append("

 Instance diagram

"); - - sb.AppendLine("
"); - - foreach (DocConceptRoot docRoot in docView.ConceptRoots) - { - if (docRoot.ApplicableEntity == entity) - { - - sb.Append(docRoot.Documentation); - - if (docRoot.Concepts.Count > 0) - { - sb.AppendLine("
"); - sb.AppendLine("Concept usage"); - foreach (DocTemplateUsage eachusage in docRoot.Concepts) - { - if (eachusage.Definition != null) - { - if (included == null || included.ContainsKey(eachusage.Definition)) - { - if (eachusage.Documentation != null) - { - eachusage.Documentation = UpdateNumbering(eachusage.Documentation, listFigures, listTables, entity); - } - - string eachtext = FormatConcept(docProject, entity, docRoot, eachusage, mapEntity, mapSchema, listFigures, listTables); - sb.Append(eachtext); - sb.AppendLine(); - } - } - } - sb.AppendLine("
"); - } - - - - } - } - } - // inherited use definitions // build list of inherited views @@ -2014,6 +1990,45 @@ private static string FormatEntityConcepts( docSuper = docProject.GetDefinition(docSuper.BaseDefinition) as DocEntity; } + if (hasConceptsAtEntity || listLines.Count > 0) + { + sb.AppendLine("
"); + sb.AppendLine("
Definitions applying to " + docView.Name + "
"); + + // link to instance diagram + if (hasConceptsAtEntity) + { + string linkdiagram = MakeLinkName(docView) + "/" + MakeLinkName(entity) + ".htm"; + sb.Append("

 Instance diagram

"); + } + + sb.AppendLine("
"); + + foreach (DocConceptRoot docRoot in docView.ConceptRoots) + { + if (docRoot.ApplicableEntity == entity) + { + + sb.Append(docRoot.Documentation); + + if (docRoot.Concepts.Count > 0) + { + sb.AppendLine("
"); + sb.AppendLine("Concept usage"); + foreach (DocTemplateUsage eachusage in docRoot.Concepts) + { + FormatEntityUsage(docProject, entity, docRoot, eachusage, mapEntity, mapSchema, listFigures, listTables, included, sb); + } + sb.AppendLine("
"); + } + + + + } + } + } + + // now format inherited use definitions if (listLines.Count > 0) { @@ -2039,23 +2054,42 @@ private static string FormatEntityConcepts( } } - //sb.AppendLine("
"); - - // add figure if it exists -#if false // don't use anymore - string fig = FormatFigure(docProject, entity, dtd, entity.Text, listFigures); - if (fig != null) - { - sb.Append(fig); - } -#endif - sb = sb.Replace("", ""); sb = sb.Replace("", ""); return sb.ToString(); } + private static void FormatEntityUsage(DocProject docProject, DocEntity entity, DocConceptRoot docRoot, DocTemplateUsage eachusage, Dictionary mapEntity, Dictionary mapSchema, List listFigures, List listTables, Dictionary included, StringBuilder sb) + { + if (eachusage.Definition != null) + { + if (included == null || included.ContainsKey(eachusage.Definition)) + { + if (eachusage.Documentation != null) + { + eachusage.Documentation = UpdateNumbering(eachusage.Documentation, listFigures, listTables, entity); + } + + string eachtext = FormatConcept(docProject, entity, docRoot, eachusage, mapEntity, mapSchema, listFigures, listTables); + sb.Append(eachtext); + sb.AppendLine(); + + if (eachusage.Concepts.Count > 0) + { + sb.AppendLine("
"); + sb.AppendLine("Concept alternates"); + + foreach (DocTemplateUsage innerusage in eachusage.Concepts) + { + FormatEntityUsage(docProject, entity, docRoot, innerusage, mapEntity, mapSchema, listFigures, listTables, included, sb); + } + sb.AppendLine("
"); + } + } + } + } + /// /// Updates content containing figure references @@ -2228,14 +2262,35 @@ public static void GenerateDocumentation( } } + Dictionary[] dictionaryViews = new Dictionary[docProject.ModelViews.Count]; + for (int i = 0; i < docProject.ModelViews.Count; i++) + { + DocModelView docView = docProject.ModelViews[i]; + if (included != null && included.ContainsKey(docView)) + { + dictionaryViews[i] = new Dictionary(); + docProject.RegisterObjectsInScope(docProject.ModelViews[i], dictionaryViews[i]); + } + } + + DocEntity docEntityRoot = docProject.GetDefinition("IfcRoot") as DocEntity; // upper contents page string pathHeaderFrame = path + "\\content.htm"; using (FormatHTM htmProp = new FormatHTM(pathHeaderFrame, mapEntity, mapSchema, included)) { - string projectname = docProject.Annotations[0].Code; - string projectcopy = docProject.Annotations[0].Copyright; + DocAnnotation docCover = docProject.Annotations[0]; + string projectname = docCover.Code; + if (!String.IsNullOrEmpty(docCover.Version)) + { + projectname += " - " + docCover.Version; + } + if (!String.IsNullOrEmpty(docCover.Status)) + { + projectname += " [" + docCover.Status + "]"; + } + string projectcopy = docCover.Copyright; htmProp.Write( "\r\n" + @@ -2347,6 +2402,7 @@ public static void GenerateDocumentation( htmSection.WriteLine("

" + docAnnotation.Name + "

"); htmSection.WriteLine(docAnnotation.Documentation); + htmSection.WriteLinkTo("foreword", 0); htmSection.WriteFooter(Properties.Settings.Default.Footer); } @@ -2364,6 +2420,7 @@ public static void GenerateDocumentation( htmSection.WriteLine("

" + docAnnotation.Name + "

"); htmSection.WriteLine(docAnnotation.Documentation); + htmSection.WriteLinkTo("introduction", 0); htmSection.WriteFooter(Properties.Settings.Default.Footer); } @@ -2699,7 +2756,7 @@ public static void GenerateDocumentation( { foreach (DocReference docRef in docProject.NormativeReferences) { - htmSection.WriteLine("
" + docRef.Name + ", " + docRef.Documentation + "
"); + htmSection.WriteLine("
" + docRef.Name + ", " + docRef.Documentation + "
"); htmSection.WriteLine("
 
"); } } @@ -2751,15 +2808,11 @@ public static void GenerateDocumentation( htmSection.WriteLine(""); htmSection.WriteLine(""); - Dictionary[] dictionaryViews = new Dictionary[docProject.ModelViews.Count]; - for (int i = 0; i < docProject.ModelViews.Count; i++) { DocModelView docView = docProject.ModelViews[i]; if (included != null && included.ContainsKey(docView)) { - dictionaryViews[i] = new Dictionary(); - docProject.RegisterObjectsInScope(docProject.ModelViews[i], dictionaryViews[i]); htmSection.WriteLine(""); } } @@ -2788,6 +2841,8 @@ public static void GenerateDocumentation( } htmSection.WriteLine("

"); + htmSection.WriteLinkTo("chapter-" + iSection, 1); + htmSection.WriteFooter(Properties.Settings.Default.Footer); } @@ -2899,6 +2954,32 @@ public static void GenerateDocumentation( htmDef.WriteLine("
Template" + docProject.ModelViews[i].Name + "
"); htmDef.WriteSummaryFooter(); } + else if (type is DocSelect) + { + DocSelect docSelect = (DocSelect)type; + + htmDef.WriteSummaryHeader("Select definition", true); + htmDef.WriteLine(""); + htmDef.WriteLine(""); + foreach (DocSelectItem docSelectItem in docSelect.Selects) + { + DocObject docRef = null; + if (mapEntity.TryGetValue(docSelectItem.Name, out docRef)) + { + if (included == null || included.ContainsKey(docRef)) + { + htmDef.Write(""); + } + } + } + htmDef.WriteLine("
TypeDescription
"); + htmDef.WriteDefinition(docSelectItem.Name); + //htmDef.Write(docSelectItem.Name); + htmDef.Write(""); + htmDef.Write(docSelectItem.Documentation); + htmDef.Write("
"); + htmDef.WriteSummaryFooter(); + } htmDef.WriteLine("
"); @@ -2960,7 +3041,7 @@ public static void GenerateDocumentation( htmDef.WriteLine("
"); // write url for incoming page link - htmDef.WriteLine("

\"Link  Link to this page

"); + htmDef.WriteLinkTo(type); htmDef.WriteFooter(Properties.Settings.Default.Footer); } @@ -3014,7 +3095,18 @@ public static void GenerateDocumentation( htmDef.WriteSummaryHeader("Attribute definitions", true); htmDef.WriteLine(""); - htmDef.WriteLine(""); + htmDef.WriteLine(""); + + if (views != null) + { + foreach (DocModelView docViewHeader in views) + { + htmDef.Write(""); + } + } + htmDef.WriteLine(""); int sequence = 0; @@ -3033,7 +3125,7 @@ public static void GenerateDocumentation( } } - htmDef.WriteEntityAttributes(entity, entity, ref sequence); + htmDef.WriteEntityAttributes(entity, entity, views, dictionaryViews, ref sequence); htmDef.WriteLine("
#AttributeTypeCardinalityDescription
#AttributeTypeCardinalityDescription"); + htmDef.Write(docViewHeader.Name.Substring(0, 1)); + htmDef.Write("
"); @@ -3109,10 +3201,20 @@ public static void GenerateDocumentation( htmDef.WriteSummaryHeader("Attribute inheritance", false); htmDef.WriteLine(""); - htmDef.WriteLine(""); + htmDef.Write(""); + if(views != null) + { + foreach(DocModelView docViewHeader in views) + { + htmDef.Write(""); + } + } + htmDef.WriteLine(""); int sequenceX = 0; - htmDef.WriteEntityInheritance(entity, entity, ref sequenceX); + htmDef.WriteEntityInheritance(entity, entity, views, dictionaryViews, ref sequenceX); htmDef.WriteLine("
#AttributeTypeCardinalityDescription
#AttributeTypeCardinalityDescription"); + htmDef.Write(docViewHeader.Name.Substring(0, 1)); + htmDef.Write("
"); @@ -3171,7 +3273,7 @@ public static void GenerateDocumentation( htmDef.WriteLine(""); // write url for incoming page link - htmDef.WriteLine("

\"Link  Link to this page

"); + htmDef.WriteLinkTo(entity); htmDef.WriteFooter(Properties.Settings.Default.Footer); } @@ -3229,7 +3331,7 @@ public static void GenerateDocumentation( htmDef.WriteLine(""); // write url for incoming page link - htmDef.WriteLine("

\"Link  Link to this page

"); + htmDef.WriteLinkTo(entity); htmDef.WriteFooter(Properties.Settings.Default.Footer); } @@ -3287,7 +3389,7 @@ public static void GenerateDocumentation( htmDef.WriteLine(""); // write url for incoming page link - htmDef.WriteLine("

\"Link  Link to this page

"); + htmDef.WriteLinkTo(entity); htmDef.WriteFooter(Properties.Settings.Default.Footer); } @@ -3388,7 +3490,7 @@ public static void GenerateDocumentation( htmDef.WriteProperties(entity.Properties); // write url for incoming page link - htmDef.WriteLine("

\"Link  Link to this page

"); + htmDef.WriteLinkTo(entity); htmDef.WriteFooter(Properties.Settings.Default.Footer); } @@ -3447,36 +3549,49 @@ public static void GenerateDocumentation( htmDef.WriteLine(""); - htmDef.WriteLine("
    \r\n"); + htmDef.WriteLine(""); + htmDef.WriteLine(""); + + bool showdefaultdesc = true; + foreach (DocPropertyConstant docprop in entity.Constants) { - htmDef.WriteLine("
  • " + docprop.Name + "
    "); + htmDef.WriteLine("
  • "); + if(showdefaultdesc) + { + htmDef.WriteLine(docprop.Documentation); } - htmDef.WriteLine("
    NameDescription
    " + docprop.Name + ""); - htmDef.WriteLine(""); - - docprop.Localization.Sort(); - foreach (DocLocalization doclocal in docprop.Localization) + if (docprop.Localization.Count > 0) { - string localname = doclocal.Name; - string localdesc = doclocal.Documentation; + htmDef.WriteLine("
    "); + docprop.Localization.Sort(); + foreach (DocLocalization doclocal in docprop.Localization) + { + string localname = doclocal.Name; + string localdesc = doclocal.Documentation; - string localid = doclocal.Locale.Substring(0, 2).ToLower(); + string localid = doclocal.Locale.Substring(0, 2).ToLower(); - if (localid.Equals("en", StringComparison.InvariantCultureIgnoreCase) && localdesc == null) - { - localdesc = docprop.Documentation; + if (localid.Equals("en", StringComparison.InvariantCultureIgnoreCase) && localdesc == null) + { + localdesc = docprop.Documentation; + showdefaultdesc = false; + } + + htmDef.WriteLine(""); } + htmDef.WriteLine("
    " + localname + "" + localdesc + "
    "); + } - htmDef.WriteLine("
    " + localname + ": " + localdesc + "
    "); - htmDef.WriteLine("\r\n"); + htmDef.WriteLine(""); } - htmDef.WriteLine("
\r\n"); + + htmDef.WriteLine(""); // write url for incoming page link - //htmDef.WriteLine("

\"Link  Link to this page

"); + htmDef.WriteLinkTo(entity); htmDef.WriteFooter(Properties.Settings.Default.Footer); } @@ -3550,16 +3665,18 @@ public static void GenerateDocumentation( } // write each quantity - htmDef.WriteLine("
    \r\n"); + htmDef.WriteLine(""); + htmDef.WriteLine(""); foreach (DocQuantity docprop in entity.Quantities) { - htmDef.WriteLine("
  • " + docprop.Name + "
    "); + htmDef.WriteLine("
  • "); } - htmDef.WriteLine("\r\n"); + htmDef.WriteLine("
    NameTypeDescription
    " + docprop.Name + ""); htmDef.WriteDefinition(docprop.QuantityType.ToString()); - htmDef.WriteLine("
    "); + htmDef.WriteLine("
    "); - if (!Properties.Settings.Default.NoXml) + bool showdefaultdesc = false; + if(docprop.Localization.Count > 0) { - htmDef.WriteLine(""); + htmDef.WriteLine("
    "); docprop.Localization.Sort(); foreach (DocLocalization doclocal in docprop.Localization) @@ -3569,26 +3686,27 @@ public static void GenerateDocumentation( string localid = doclocal.Locale.Substring(0, 2).ToLower(); - if (localid.Equals("en", StringComparison.InvariantCultureIgnoreCase) && localdesc == null) + if (String.IsNullOrEmpty(localdesc) && localid.Equals("en", StringComparison.InvariantCultureIgnoreCase) && localdesc == null) { localdesc = docprop.Documentation; + showdefaultdesc = false; } - htmDef.WriteLine(""); + htmDef.WriteLine(""); } htmDef.WriteLine("
    " + localname + ": " + localdesc + "
    " + localname + "" + localdesc + "
    "); } - else + if(showdefaultdesc) { - htmDef.WriteDocumentationForISO(docprop.Documentation + "\r\n", null, Properties.Settings.Default.NoHistory); + htmDef.WriteLine(docprop.Documentation); } - htmDef.WriteLine("\r\n"); + htmDef.WriteLine("
    "); // write url for incoming page link - htmDef.WriteLine("

    \"Link  Link to this page

    "); + htmDef.WriteLinkTo(entity); htmDef.WriteFooter(Properties.Settings.Default.Footer); } @@ -3609,6 +3727,9 @@ public static void GenerateDocumentation( htmSchema.WriteLine( "

    \"Link EXPRESS-G diagram

    "); + // link to this page + htmSchema.WriteLinkTo(schema); + htmSchema.WriteFooter(Properties.Settings.Default.Footer); } } @@ -3654,7 +3775,7 @@ public static void GenerateDocumentation( if (chAnnex == 'A') { // create page for model view - htmSection.WriteComputerListing("IFC4", "ifc4", 0); + //htmSection.WriteComputerListing("IFC4", "ifc4", 0); /* DoExport(docProject, path + @"\annex\annex-a\default\ifc4.exp", null, null, instances, true); @@ -3692,6 +3813,7 @@ public static void GenerateDocumentation( htmSection.WriteInheritanceMapping(docProject, views); } + htmSection.WriteLinkTo("annex-" + chAnnex.ToString().ToLower(), 1); htmSection.WriteFooter(Properties.Settings.Default.Footer); } @@ -3740,11 +3862,11 @@ public static void GenerateDocumentation( { DocModelView[] modelviews = docProject.GetViewInheritance(docModelView); - DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".exp", modelviews, locales, instances, true); - DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".xsd", modelviews, locales, instances, true); - DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".ifc", modelviews, locales, instances, true); - DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".ifcxml", modelviews, locales, instances, true); - DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".xml", modelviews, locales, instances, true); + DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".exp", modelviews, locales, instances); + DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".xsd", modelviews, locales, instances); + DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".ifc", modelviews, locales, instances); + DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".ifcxml", modelviews, locales, instances); + DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".xml", modelviews, locales, instances); using (FormatHTM htmExpress = new FormatHTM(path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".exp.htm", mapEntity, mapSchema, included)) { @@ -3758,7 +3880,7 @@ public static void GenerateDocumentation( using (FormatHTM htmXSD = new FormatHTM(path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".xsd.htm", mapEntity, mapSchema, included)) { string xsdcontent = null; - using (System.IO.StreamReader reader = new System.IO.StreamReader(path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".xsd.txt")) + using (System.IO.StreamReader reader = new System.IO.StreamReader(path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".xsd")) { xsdcontent = reader.ReadToEnd(); } @@ -3770,7 +3892,7 @@ public static void GenerateDocumentation( } } - DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".mvdxml", new DocModelView[] { docModelView }, locales, instances, true); + DoExport(docProject, path + @"\annex\annex-a\" + MakeLinkName(docModelView) + @"\" + docModelView.Code + ".mvdxml", new DocModelView[] { docModelView }, locales, instances); } } @@ -3859,38 +3981,38 @@ public static void GenerateDocumentation( // generate alphabetical listings using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/alphabeticalorder_definedtypes.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteAlphabeticalListing("Defined Types", Properties.Settings.Default.Footer); + htmAlpha1.WriteAlphabeticalListing("Defined Types", path, "definedtypes"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/alphabeticalorder_enumtypes.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteAlphabeticalListing("Enumeration Types", Properties.Settings.Default.Footer); + htmAlpha1.WriteAlphabeticalListing("Enumeration Types", path, "enumtypes"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/alphabeticalorder_selecttypes.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteAlphabeticalListing("Select Types", Properties.Settings.Default.Footer); + htmAlpha1.WriteAlphabeticalListing("Select Types", path, "selecttypes"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/alphabeticalorder_entities.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteAlphabeticalListing("Entities", Properties.Settings.Default.Footer); + htmAlpha1.WriteAlphabeticalListing("Entities", path, "entities"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/alphabeticalorder_functions.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteAlphabeticalListing("Functions", Properties.Settings.Default.Footer); + htmAlpha1.WriteAlphabeticalListing("Functions", path, "functions"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/alphabeticalorder_rules.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteAlphabeticalListing("Rules", Properties.Settings.Default.Footer); + htmAlpha1.WriteAlphabeticalListing("Rules", path, "rules"); } // no translations currently -- enable in future using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/alphabeticalorder_psets.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteAlphabeticalListing("Property Sets", Properties.Settings.Default.Footer); + htmAlpha1.WriteAlphabeticalListing("Property Sets", path, "psets"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/alphabeticalorder_qsets.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteAlphabeticalListing("Quantity Sets", Properties.Settings.Default.Footer); + htmAlpha1.WriteAlphabeticalListing("Quantity Sets", path, "qsets"); } - + // generate localized listings foreach (string locale in listLocale.Keys) @@ -3899,35 +4021,35 @@ public static void GenerateDocumentation( using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/" + locale + "/alphabeticalorder_definedtypes.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteLocalizedListing("Defined Types", code); + htmAlpha1.WriteLocalizedListing("Defined Types", code, path, "definedtypes"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/" + locale + "/alphabeticalorder_enumtypes.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteLocalizedListing("Enumeration Types", code); + htmAlpha1.WriteLocalizedListing("Enumeration Types", code, path, "enumtypes"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/" + locale + "/alphabeticalorder_selecttypes.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteLocalizedListing("Select Types", code); + htmAlpha1.WriteLocalizedListing("Select Types", code, path, "selecttypes"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/" + locale + "/alphabeticalorder_entities.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteLocalizedListing("Entities", code); + htmAlpha1.WriteLocalizedListing("Entities", code, path, "entities"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/" + locale + "/alphabeticalorder_functions.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteLocalizedListing("Functions", code); + htmAlpha1.WriteLocalizedListing("Functions", code, path, "functions"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/" + locale + "/alphabeticalorder_rules.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteLocalizedListing("Rules", code); + htmAlpha1.WriteLocalizedListing("Rules", code, path, "rules"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/" + locale + "/alphabeticalorder_psets.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteLocalizedListing("Property Sets", code); + htmAlpha1.WriteLocalizedListing("Property Sets", code, path, "psets"); } using (FormatHTM htmAlpha1 = new FormatHTM(path + "/annex/annex-b/" + locale + "/alphabeticalorder_qsets.htm", mapEntity, mapSchema, included)) { - htmAlpha1.WriteLocalizedListing("Quantity Sets", code); + htmAlpha1.WriteLocalizedListing("Quantity Sets", code, path, "qsets"); } } @@ -3974,8 +4096,13 @@ public static void GenerateDocumentation( htmCover.WriteLine("\"""); } htmCover.WriteLine(""); - + htmCover.WriteLinkTo("inheritance-" + MakeLinkName(docView), 3); htmCover.WriteFooter(String.Empty); + + using (FormatHTM htmLink = new FormatHTM(path + "/link/inheritance-" + MakeLinkName(docView) + ".htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../annex/annex-c/" + DocumentationISO.MakeLinkName(docView) + "/index.htm"); + } } // create image after (depends on directory being created first) @@ -3997,7 +4124,7 @@ public static void GenerateDocumentation( htmSectionTOC.WriteLine("C." + iView + ".1 All entities"); using (FormatHTM htmInheritAll = new FormatHTM(path + "/annex/annex-c/" + MakeLinkName(docView) + "/all.htm", mapEntity, mapSchema, included)) { - htmInheritAll.WriteInheritanceListing(null, false, "All entities"); + htmInheritAll.WriteInheritanceListing(null, false, "All entities", docView, path, "all"); } // specific inheritance @@ -4005,14 +4132,14 @@ public static void GenerateDocumentation( htmSectionTOC.WriteLine("C." + iView + ".2 Rooted entities"); using (FormatHTM htmInheritAll = new FormatHTM(path + "/annex/annex-c/" + MakeLinkName(docView) + "/roots.htm", mapEntity, mapSchema, included)) { - htmInheritAll.WriteInheritanceListing("IfcRoot", false, "Rooted entities"); + htmInheritAll.WriteInheritanceListing("IfcRoot", false, "Rooted entities", docView, path, "roots"); } htmTOC.WriteTOC(1, "C." + iView + ".3 Object types"); htmSectionTOC.WriteLine("C." + iView + ".3 Object types"); using (FormatHTM htmInheritAll = new FormatHTM(path + "/annex/annex-c/" + MakeLinkName(docView) + "/types.htm", mapEntity, mapSchema, included)) { - htmInheritAll.WriteInheritanceListing("IfcObject", true, "Object types"); + htmInheritAll.WriteInheritanceListing("IfcObject", true, "Object types", docView, path, "types"); } htmSectionTOC.WriteLine(" "); @@ -4348,7 +4475,7 @@ public static void GenerateDocumentation( } } - GenerateExample(docExample, listFormats, path, indexpath, included, mapEntity, mapSchema, typemap, htmTOC, htmSectionTOC); + GenerateExample(docExample, listFormats, path, indexpath, included, mapEntity, mapSchema, typemap, listFigures, listTables, htmTOC, htmSectionTOC); } } break; @@ -4369,7 +4496,7 @@ public static void GenerateDocumentation( htmWhatsnew.WriteScript(iAnnex, iChangeset, 0, 0); htmWhatsnew.WriteLine("

    F." + iChangeset + " " + docChangeSet.Name + "

    "); htmWhatsnew.WriteDocumentationForISO(docChangeSet.Documentation, docChangeSet, false); - + htmWhatsnew.WriteLinkTo(MakeLinkName(docChangeSet), 3); htmWhatsnew.WriteFooter(Properties.Settings.Default.Footer); } @@ -4398,6 +4525,7 @@ public static void GenerateDocumentation( } htmChange.WriteLine(""); + htmChange.WriteLinkTo(MakeLinkName(docChangeSet) + "-changelog", 3); htmChange.WriteFooter(Properties.Settings.Default.Footer); } @@ -4429,6 +4557,7 @@ public static void GenerateDocumentation( } htmChange.WriteLine(""); + htmChange.WriteLinkTo(MakeLinkName(docChangeSet) + "-properties", 3); htmChange.WriteFooter(Properties.Settings.Default.Footer); } @@ -4461,6 +4590,7 @@ public static void GenerateDocumentation( } htmChange.WriteLine(""); + htmChange.WriteLinkTo(MakeLinkName(docChangeSet) + "-quantities", 3); htmChange.WriteFooter(Properties.Settings.Default.Footer); } @@ -4524,6 +4654,8 @@ public static void GenerateDocumentation( htmTOC.WriteContentRefs(listFigures, "Figure"); htmTOC.WriteLine("

    "); + htmTOC.WriteLine("

    "); + // write tables htmTOC.WriteLine("

    Tables

    "); htmTOC.WriteLine("

    "); @@ -4598,7 +4730,7 @@ public static void GenerateDocumentation( DocObject refobj = (DocObject)mapEntity[refkey]; string display = refobj.Name;//refnumber; // new: use names for bSI; numbers for ISO - if (refobj is DocPropertySet) + if (refobj is DocPropertySet || refobj is DocPropertyEnumeration) { htmIndex.Write(comma + "" + display + ""); } @@ -4625,8 +4757,19 @@ public static void GenerateDocumentation( // new: incoming links foreach(DocSection docLinkSection in docProject.Sections) { - foreach(DocSchema docLinkSchema in docLinkSection.Schemas) + int iSection = docProject.Sections.IndexOf(docLinkSection) + 1; + using (FormatHTM htmLink = new FormatHTM(path + "/link/chapter-" + iSection.ToString() + ".htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../schema/chapter-" + iSection.ToString() + ".htm"); + } + + foreach (DocSchema docLinkSchema in docLinkSection.Schemas) { + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + MakeLinkName(docLinkSchema) + ".htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../schema/" + docLinkSchema.Name.ToLower() + "/content.htm"); + } + foreach (DocEntity docLinkObj in docLinkSchema.Entities) { if (included == null || included.ContainsKey(docLinkObj)) @@ -4682,6 +4825,17 @@ public static void GenerateDocumentation( } } + foreach (DocPropertyEnumeration docLinkObj in docLinkSchema.PropertyEnums) + { + if (included == null || included.ContainsKey(docLinkObj)) + { + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + MakeLinkName(docLinkObj) + ".htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../schema/" + docLinkSchema.Name.ToLower() + "/pset/" + MakeLinkName(docLinkObj) + ".htm"); + } + } + } + foreach (DocQuantitySet docLinkObj in docLinkSchema.QuantitySets) { if (included == null || included.ContainsKey(docLinkObj)) @@ -4695,6 +4849,56 @@ public static void GenerateDocumentation( } } + char chAnnex = 'a'; + foreach(DocAnnex docAnnex in docProject.Annexes) + { + using (FormatHTM htmLink = new FormatHTM(path + "/link/annex-" + chAnnex + ".htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../annex/annex-" + chAnnex + ".htm"); + } + + chAnnex++; + } + + foreach(DocAnnotation docAnnot in docProject.Annotations) + { + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + MakeLinkName(docAnnot) + ".htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../" + MakeLinkName(docAnnot) + ".htm"); + } + } + + foreach(DocChangeSet docChange in docProject.ChangeSets) + { + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + MakeLinkName(docChange) + ".htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../annex/annex-f/" + MakeLinkName(docChange) + "/index.htm"); + } + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + MakeLinkName(docChange) + "-changelog.htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../annex/annex-f/" + MakeLinkName(docChange) + "/changelog.htm"); + } + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + MakeLinkName(docChange) + "-properties.htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../annex/annex-f/" + MakeLinkName(docChange) + "/properties.htm"); + } + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + MakeLinkName(docChange) + "-quantities.htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../annex/annex-f/" + MakeLinkName(docChange) + "/quantities.htm"); + } + } + + foreach(DocModelView docView in docProject.ModelViews) + { + if (docView.Code != null) + { + using (FormatHTM htmLink = new FormatHTM(path + "/link/listing-" + docView.Code.ToLower() + ".htm", mapEntity, mapSchema, included)) + { + htmLink.WriteLinkPage("../annex/annex-a/" + MakeLinkName(docView) + "/index.htm"); + } + } + } + #if false foreach (string key in listIndex.Keys) { diff --git a/FormAbout.Designer.cs b/FormAbout.Designer.cs index 5814108a..be4d19d0 100644 --- a/FormAbout.Designer.cs +++ b/FormAbout.Designer.cs @@ -35,23 +35,31 @@ private void InitializeComponent() // // button1 // - resources.ApplyResources(this.button1, "button1"); this.button1.DialogResult = System.Windows.Forms.DialogResult.OK; + this.button1.Location = new System.Drawing.Point(164, 226); this.button1.Name = "button1"; + this.button1.Size = new System.Drawing.Size(75, 23); + this.button1.TabIndex = 1; + this.button1.Text = "OK"; this.button1.UseVisualStyleBackColor = true; // // textBox1 // - resources.ApplyResources(this.textBox1, "textBox1"); this.textBox1.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.textBox1.Location = new System.Drawing.Point(12, 12); + this.textBox1.Multiline = true; this.textBox1.Name = "textBox1"; this.textBox1.ReadOnly = true; + this.textBox1.Size = new System.Drawing.Size(360, 184); + this.textBox1.TabIndex = 0; + this.textBox1.Text = resources.GetString("textBox1.Text"); // // FormAbout // this.AcceptButton = this.button1; - resources.ApplyResources(this, "$this"); + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(384, 261); this.Controls.Add(this.textBox1); this.Controls.Add(this.button1); this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog; @@ -60,6 +68,7 @@ private void InitializeComponent() this.Name = "FormAbout"; this.ShowIcon = false; this.ShowInTaskbar = false; + this.Text = "About IfcDoc"; this.ResumeLayout(false); this.PerformLayout(); diff --git a/FormAbout.resx b/FormAbout.resx index b10e3c1a..e1aaca7d 100644 --- a/FormAbout.resx +++ b/FormAbout.resx @@ -112,22 +112,22 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 IFC Documentation Generator -Version 8.8 (January 21, 2015) +Version 9.4 (September 12, 2015) © Copyright 2011-2015 buildingSMART International Ltd. Model Support Group (MSG) Thomas Liebich - MSG Leader (tl@aec3.com) -Comments, issues or any other feedback should be sent to: -Tim Chipman (timc@constructivity.com) +Comments, issues or any other feedback may be posted at: +https://github.com/BuildingSMART/IfcDoc -MVD-XML Version 1.1 +MVD-XML Version 1.1d - + \ No newline at end of file diff --git a/FormConstraint.ja.resx b/FormConstraint.ja.resx index bd743d25..dad53630 100644 --- a/FormConstraint.ja.resx +++ b/FormConstraint.ja.resx @@ -117,76 +117,11 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - - サイズ - - - - - - 一意 - - - 均等割 - - - ノットイコール - - - より大きい - - - より大きいまたは等しい - - - より小さい - - - より小さいまたは等しい - - - 含まれる + + + Bottom, Left - - 45, 13 - - - メトリック - - - 43, 13 - - - 演算子 - - - 19, 13 - - - - - - OK - - - キャンセル - - - 31, 13 - - - 表現 - - - 255, 13 - - - 複数の値のために、コンマや別々のラインを使用する。 - AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAA diff --git a/FormConstraint.resx b/FormConstraint.resx index 24c31693..dd132fdc 100644 --- a/FormConstraint.resx +++ b/FormConstraint.resx @@ -117,284 +117,386 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Top, Left, Right + + + Value + + + Size + + + Type + + + Unique + - - 300, 274 + + 13, 25 - - Metric: + + 359, 21 - - Equal + + + 1 + + + comboBoxMetric + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this 11 - - - 10 + + Top, Left, Right + + + Equal + + + Not Equal + + + Greater Than + + + Greater Than Or Equal + + + Less Than + + + Less Than Or Equal Included In - + + 13, 75 + + + 359, 21 + + + 3 + + + comboBoxOperator + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this + + 10 + + + Top, Bottom, Left, Right + + + False + 13, 152 - - - Bottom, Left, Right + + True - - 297, 426 + + Vertical - - Greater Than + + 359, 230 + + + 5 + + + textBoxBenchmark + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this 9 - - Unique + + True - - OK + + 10, 8 - - FormConstraint + + 39, 13 + + + 0 + + + Metric: label1 - - Top, Left, Right + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 13, 75 + + $this - - 12, 385 + + 8 - - 359, 21 + + True - - 9 + + 10, 58 - - 1 + + 51, 13 - - 6 + + 2 - - Less Than + + Operator: - - False + + label2 - + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + True + + 10, 108 + 37, 13 - - 13, 25 - - - 7 + + 4 - - 6, 13 + + Value: label3 - - textBoxExpression - - - True + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - - False + + 6 - - $this + + Bottom, Right - - 359, 21 + + 213, 426 - - $this + + 75, 23 - + 8 - - Value - - - False + + OK - - 0 + + buttonOK System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - 39, 13 - - + $this - - Constraint + + 5 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Bottom, Right - - 10 + + 297, 426 - - 359, 230 + + 75, 23 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 9 - - label5 + + Cancel - - Size + + buttonCancel - - 1 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Top, Left, Right + + $this - - 7 + + 4 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Bottom, Left, Right - - 3 + + 13, 428 - - 51, 13 + + 194, 20 - - comboBoxMetric + + 7 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + False - - Cancel + + textBoxExpression - - 0 + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + $this - + + 3 + + Bottom, Left, Right - - label4 + + True - - 8 + + 10, 411 - - 359, 21 + + 61, 13 - - Less Than Or Equal + + 6 Expression: - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 14 - - - Value: + + False - - comboBoxOperator + + label4 - - buttonCancel + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this - - Type - 2 - - 75, 23 + + Top, Left, Right - - $this + + False - - 5 + + 13, 125 - - $this + + 359, 21 - + + 10 + + + False + + + comboBoxValue + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - 13, 125 + + 1 - - Top, Left, Right + + Bottom, Left True - - Not Equal + + 12, 385 - - False + + 309, 13 - + + 14 + + + For multiple values, use commas and/or separate lines to delimit. + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - + + 0 + + True + + + 6, 13 - - Top, Bottom, Left, Right + + 384, 461 @@ -491,118 +593,16 @@ 8f+AAPH/gADx/4AA8f/wAPD/8AHx//AD8f////D/ - - For multiple values, use commas and/or separate lines to delimit. - - - Greater Than Or Equal - - - comboBoxValue - - - 213, 426 - - - 10, 8 - - - 75, 23 - - - textBoxBenchmark - - - Operator: - - - 4 - - - True - - - 10, 58 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 10, 411 - - - 61, 13 - - - 309, 13 - - - False - - - 194, 20 - - - 10, 108 - - - 13, 428 - - - 4 - - - buttonOK - - - label2 - - - 3 - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 300, 274 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Constraint - - 384, 461 + + FormConstraint System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 5 - - - Vertical - - - 6 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bottom, Right - - - Bottom, Right - - - $this - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 2 - - - True - - - ja - \ No newline at end of file diff --git a/FormEdit.Designer.cs b/FormEdit.Designer.cs index 179881bf..b6d00718 100644 --- a/FormEdit.Designer.cs +++ b/FormEdit.Designer.cs @@ -31,7 +31,6 @@ private void InitializeComponent() this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormEdit)); this.splitContainerRoot = new System.Windows.Forms.SplitContainer(); - this.treeView = new IfcDoc.ThemedTreeView(); this.contextMenuStrip = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItemContextInsert = new System.Windows.Forms.ToolStripMenuItem(); this.toolStripMenuItemContextInsertModelView = new System.Windows.Forms.ToolStripMenuItem(); @@ -57,18 +56,15 @@ private void InitializeComponent() this.panelWorkspace = new System.Windows.Forms.Panel(); this.panelDiagram = new System.Windows.Forms.Panel(); this.splitContainerWorkspace = new System.Windows.Forms.SplitContainer(); - this.ctlConcept = new IfcDoc.CtlConcept(); - this.ctlExpressG = new IfcDoc.CtlExpressG(); - this.ctlCheckGrid = new IfcDoc.CtlCheckGrid(); - this.ctlInheritance = new IfcDoc.CtlInheritance(); - this.ctlProperties = new IfcDoc.CtlProperties(); this.textBoxHTML = new System.Windows.Forms.TextBox(); this.webBrowser = new System.Windows.Forms.WebBrowser(); + this.splitContainerInstances = new System.Windows.Forms.SplitContainer(); this.listViewValidate = new System.Windows.Forms.ListView(); this.columnHeaderInstanceID = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeaderInstanceType = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeaderInstanceName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.imageListValidate = new System.Windows.Forms.ImageList(this.components); + this.treeViewInstance = new System.Windows.Forms.TreeView(); this.toolStrip1 = new System.Windows.Forms.ToolStrip(); this.toolStripLabelValidateFile = new System.Windows.Forms.ToolStripLabel(); this.toolStripButtonValidateClose = new System.Windows.Forms.ToolStripButton(); @@ -246,6 +242,14 @@ private void InitializeComponent() this.imageListRules = new System.Windows.Forms.ImageList(this.components); this.saveFileDialogModule = new System.Windows.Forms.SaveFileDialog(); this.openFileDialogExpress = new System.Windows.Forms.OpenFileDialog(); + this.treeView = new IfcDoc.ThemedTreeView(); + this.ctlConcept = new IfcDoc.CtlConcept(); + this.ctlExpressG = new IfcDoc.CtlExpressG(); + this.ctlCheckGrid = new IfcDoc.CtlCheckGrid(); + this.ctlInheritance = new IfcDoc.CtlInheritance(); + this.ctlProperties = new IfcDoc.CtlProperties(); + this.toolStripMenuItemContextInsertPropertyEnum = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItemContextInsertPropertyConstant = new System.Windows.Forms.ToolStripMenuItem(); ((System.ComponentModel.ISupportInitialize)(this.splitContainerRoot)).BeginInit(); this.splitContainerRoot.Panel1.SuspendLayout(); this.splitContainerRoot.Panel2.SuspendLayout(); @@ -261,6 +265,10 @@ private void InitializeComponent() this.splitContainerWorkspace.Panel1.SuspendLayout(); this.splitContainerWorkspace.Panel2.SuspendLayout(); this.splitContainerWorkspace.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerInstances)).BeginInit(); + this.splitContainerInstances.Panel1.SuspendLayout(); + this.splitContainerInstances.Panel2.SuspendLayout(); + this.splitContainerInstances.SuspendLayout(); this.toolStrip1.SuspendLayout(); this.menuStrip1.SuspendLayout(); this.toolStripMain.SuspendLayout(); @@ -279,20 +287,6 @@ private void InitializeComponent() // this.splitContainerRoot.Panel2.Controls.Add(this.splitContainerEdit); // - // treeView - // - this.treeView.ContextMenuStrip = this.contextMenuStrip; - resources.ApplyResources(this.treeView, "treeView"); - this.treeView.HideSelection = false; - this.treeView.ImageList = this.imageListIcon; - this.treeView.LabelEdit = true; - this.treeView.Name = "treeView"; - this.treeView.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeView_BeforeLabelEdit); - this.treeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeView_AfterLabelEdit); - this.treeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag); - this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterSelect); - this.treeView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseUp); - // // contextMenuStrip // this.contextMenuStrip.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { @@ -317,6 +311,8 @@ private void InitializeComponent() this.toolStripMenuItemContextInsertConstant, this.toolStripMenuItemContextInsertPset, this.toolStripMenuItemContextInsertProperty, + this.toolStripMenuItemContextInsertPropertyEnum, + this.toolStripMenuItemContextInsertPropertyConstant, this.toolStripMenuItemContextInsertQset, this.toolStripMenuItemContextInsertQuantity, this.toolStripMenuItemContextInsertExample, @@ -489,7 +485,7 @@ private void InitializeComponent() // // splitContainerEdit.Panel2 // - this.splitContainerEdit.Panel2.Controls.Add(this.listViewValidate); + this.splitContainerEdit.Panel2.Controls.Add(this.splitContainerInstances); this.splitContainerEdit.Panel2.Controls.Add(this.toolStrip1); this.splitContainerEdit.Panel2Collapsed = true; // @@ -524,63 +520,6 @@ private void InitializeComponent() // this.splitContainerWorkspace.Panel2.Controls.Add(this.ctlProperties); // - // ctlConcept - // - resources.ApplyResources(this.ctlConcept, "ctlConcept"); - this.ctlConcept.ConceptRoot = null; - this.ctlConcept.CurrentInstance = null; - this.ctlConcept.Map = null; - this.ctlConcept.Name = "ctlConcept"; - this.ctlConcept.Project = null; - this.ctlConcept.Selection = null; - this.ctlConcept.Template = null; - this.ctlConcept.SelectionChanged += new System.EventHandler(this.ctlConcept_SelectionChanged); - this.ctlConcept.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ctlConcept_MouseDoubleClick); - // - // ctlExpressG - // - resources.ApplyResources(this.ctlExpressG, "ctlExpressG"); - this.ctlExpressG.Map = null; - this.ctlExpressG.Mode = IfcDoc.ToolMode.Select; - this.ctlExpressG.Name = "ctlExpressG"; - this.ctlExpressG.Schema = null; - this.ctlExpressG.ScrollToSelection = true; - this.ctlExpressG.Selection = null; - this.ctlExpressG.SelectionChanged += new System.EventHandler(this.ctlExpressG_SelectionChanged); - this.ctlExpressG.LinkOperation += new System.EventHandler(this.ctlExpressG_LinkOperation); - this.ctlExpressG.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ctlExpressG_MouseDoubleClick); - // - // ctlCheckGrid - // - resources.ApplyResources(this.ctlCheckGrid, "ctlCheckGrid"); - this.ctlCheckGrid.CheckGridSource = null; - this.ctlCheckGrid.Mode = IfcDoc.ToolMode.Select; - this.ctlCheckGrid.Name = "ctlCheckGrid"; - this.ctlCheckGrid.Selection = null; - this.ctlCheckGrid.SelectionChanged += new System.EventHandler(this.ctlCheckGrid_SelectionChanged); - // - // ctlInheritance - // - resources.ApplyResources(this.ctlInheritance, "ctlInheritance"); - this.ctlInheritance.Entity = null; - this.ctlInheritance.Mode = IfcDoc.ToolMode.Select; - this.ctlInheritance.ModelView = null; - this.ctlInheritance.Name = "ctlInheritance"; - this.ctlInheritance.Project = null; - this.ctlInheritance.SelectionChanged += new System.EventHandler(this.ctlInheritance_SelectionChanged); - // - // ctlProperties - // - this.ctlProperties.CurrentInstance = null; - this.ctlProperties.CurrentPopulation = null; - resources.ApplyResources(this.ctlProperties, "ctlProperties"); - this.ctlProperties.Name = "ctlProperties"; - this.ctlProperties.SelectedAttribute = null; - this.ctlProperties.SelectedRule = null; - this.ctlProperties.Navigate += new System.EventHandler(this.ctlProperties_Navigate); - this.ctlProperties.RuleSelectionChanged += new System.EventHandler(this.ctlProperties_RuleSelectionChanged); - this.ctlProperties.RuleContentChanged += new System.EventHandler(this.ctlProperties_RuleContentChanged); - // // textBoxHTML // this.textBoxHTML.BorderStyle = System.Windows.Forms.BorderStyle.None; @@ -594,6 +533,19 @@ private void InitializeComponent() this.webBrowser.Name = "webBrowser"; this.webBrowser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(this.WebBrowser_Navigating); // + // splitContainerInstances + // + resources.ApplyResources(this.splitContainerInstances, "splitContainerInstances"); + this.splitContainerInstances.Name = "splitContainerInstances"; + // + // splitContainerInstances.Panel1 + // + this.splitContainerInstances.Panel1.Controls.Add(this.listViewValidate); + // + // splitContainerInstances.Panel2 + // + this.splitContainerInstances.Panel2.Controls.Add(this.treeViewInstance); + // // listViewValidate // this.listViewValidate.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { @@ -631,6 +583,13 @@ private void InitializeComponent() this.imageListValidate.Images.SetKeyName(2, "Processed.png"); this.imageListValidate.Images.SetKeyName(3, "NotApproved.png"); // + // treeViewInstance + // + this.treeViewInstance.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + resources.ApplyResources(this.treeViewInstance, "treeViewInstance"); + this.treeViewInstance.Name = "treeViewInstance"; + this.treeViewInstance.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeViewInstance_BeforeExpand); + // // toolStrip1 // this.toolStrip1.GripStyle = System.Windows.Forms.ToolStripGripStyle.Hidden; @@ -1847,6 +1806,90 @@ private void InitializeComponent() // resources.ApplyResources(this.openFileDialogExpress, "openFileDialogExpress"); // + // treeView + // + this.treeView.ContextMenuStrip = this.contextMenuStrip; + resources.ApplyResources(this.treeView, "treeView"); + this.treeView.HideSelection = false; + this.treeView.ImageList = this.imageListIcon; + this.treeView.LabelEdit = true; + this.treeView.Name = "treeView"; + this.treeView.BeforeLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeView_BeforeLabelEdit); + this.treeView.AfterLabelEdit += new System.Windows.Forms.NodeLabelEditEventHandler(this.treeView_AfterLabelEdit); + this.treeView.ItemDrag += new System.Windows.Forms.ItemDragEventHandler(this.treeView_ItemDrag); + this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.TreeView_AfterSelect); + this.treeView.MouseUp += new System.Windows.Forms.MouseEventHandler(this.treeView_MouseUp); + // + // ctlConcept + // + resources.ApplyResources(this.ctlConcept, "ctlConcept"); + this.ctlConcept.ConceptRoot = null; + this.ctlConcept.CurrentInstance = null; + this.ctlConcept.Map = null; + this.ctlConcept.Name = "ctlConcept"; + this.ctlConcept.Project = null; + this.ctlConcept.Selection = null; + this.ctlConcept.Template = null; + this.ctlConcept.SelectionChanged += new System.EventHandler(this.ctlConcept_SelectionChanged); + this.ctlConcept.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ctlConcept_MouseDoubleClick); + // + // ctlExpressG + // + this.ctlExpressG.AllowDrop = true; + resources.ApplyResources(this.ctlExpressG, "ctlExpressG"); + this.ctlExpressG.Map = null; + this.ctlExpressG.Mode = IfcDoc.ToolMode.Select; + this.ctlExpressG.Name = "ctlExpressG"; + this.ctlExpressG.Schema = null; + this.ctlExpressG.ScrollToSelection = true; + this.ctlExpressG.Selection = null; + this.ctlExpressG.SelectionChanged += new System.EventHandler(this.ctlExpressG_SelectionChanged); + this.ctlExpressG.LinkOperation += new System.EventHandler(this.ctlExpressG_LinkOperation); + this.ctlExpressG.MouseDoubleClick += new System.Windows.Forms.MouseEventHandler(this.ctlExpressG_MouseDoubleClick); + // + // ctlCheckGrid + // + resources.ApplyResources(this.ctlCheckGrid, "ctlCheckGrid"); + this.ctlCheckGrid.CheckGridSource = null; + this.ctlCheckGrid.Mode = IfcDoc.ToolMode.Select; + this.ctlCheckGrid.Name = "ctlCheckGrid"; + this.ctlCheckGrid.Selection = null; + this.ctlCheckGrid.SelectionChanged += new System.EventHandler(this.ctlCheckGrid_SelectionChanged); + // + // ctlInheritance + // + resources.ApplyResources(this.ctlInheritance, "ctlInheritance"); + this.ctlInheritance.Entity = null; + this.ctlInheritance.Mode = IfcDoc.ToolMode.Select; + this.ctlInheritance.ModelView = null; + this.ctlInheritance.Name = "ctlInheritance"; + this.ctlInheritance.Project = null; + this.ctlInheritance.SelectionChanged += new System.EventHandler(this.ctlInheritance_SelectionChanged); + // + // ctlProperties + // + this.ctlProperties.CurrentInstance = null; + this.ctlProperties.CurrentPopulation = null; + resources.ApplyResources(this.ctlProperties, "ctlProperties"); + this.ctlProperties.Name = "ctlProperties"; + this.ctlProperties.SelectedAttribute = null; + this.ctlProperties.SelectedRule = null; + this.ctlProperties.Navigate += new System.EventHandler(this.ctlProperties_Navigate); + this.ctlProperties.RuleSelectionChanged += new System.EventHandler(this.ctlProperties_RuleSelectionChanged); + this.ctlProperties.RuleContentChanged += new System.EventHandler(this.ctlProperties_RuleContentChanged); + // + // toolStripMenuItemContextInsertPropertyEnum + // + resources.ApplyResources(this.toolStripMenuItemContextInsertPropertyEnum, "toolStripMenuItemContextInsertPropertyEnum"); + this.toolStripMenuItemContextInsertPropertyEnum.Name = "toolStripMenuItemContextInsertPropertyEnum"; + this.toolStripMenuItemContextInsertPropertyEnum.Click += new System.EventHandler(this.toolStripMenuItemInsertPropertyEnumeration_Click); + // + // toolStripMenuItemContextInsertPropertyConstant + // + resources.ApplyResources(this.toolStripMenuItemContextInsertPropertyConstant, "toolStripMenuItemContextInsertPropertyConstant"); + this.toolStripMenuItemContextInsertPropertyConstant.Name = "toolStripMenuItemContextInsertPropertyConstant"; + this.toolStripMenuItemContextInsertPropertyConstant.Click += new System.EventHandler(this.toolStripMenuItemInsertPropertyConstant_Click); + // // FormEdit // this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; @@ -1873,6 +1916,10 @@ private void InitializeComponent() this.splitContainerWorkspace.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitContainerWorkspace)).EndInit(); this.splitContainerWorkspace.ResumeLayout(false); + this.splitContainerInstances.Panel1.ResumeLayout(false); + this.splitContainerInstances.Panel2.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.splitContainerInstances)).EndInit(); + this.splitContainerInstances.ResumeLayout(false); this.toolStrip1.ResumeLayout(false); this.toolStrip1.PerformLayout(); this.menuStrip1.ResumeLayout(false); @@ -2102,5 +2149,9 @@ private void InitializeComponent() private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemEditBuildConcepts; private System.Windows.Forms.OpenFileDialog openFileDialogExpress; private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemContextInsertConstant; + private System.Windows.Forms.SplitContainer splitContainerInstances; + private System.Windows.Forms.TreeView treeViewInstance; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemContextInsertPropertyEnum; + private System.Windows.Forms.ToolStripMenuItem toolStripMenuItemContextInsertPropertyConstant; } } \ No newline at end of file diff --git a/FormEdit.cs b/FormEdit.cs index 6b520a1a..b8413b89 100644 --- a/FormEdit.cs +++ b/FormEdit.cs @@ -262,6 +262,7 @@ private void LoadFile(string filename) { this.SetCurrentFile(filename); + this.m_lastid = 0; this.m_instances.Clear(); this.m_mapTree.Clear(); @@ -291,6 +292,10 @@ private void LoadFile(string filename) catch (Exception x) { MessageBox.Show(this, x.Message, "Error", MessageBoxButtons.OK); + + // force new as state is now invalid + this.m_modified = false; + this.toolStripMenuItemFileNew_Click(this, EventArgs.Empty); return; } @@ -697,7 +702,7 @@ private void toolStripMenuItemFileSave_Click(object sender, EventArgs e) case ".ifcdoc": using (FormatSPF format = new FormatSPF(this.m_file, SchemaDOC.Types, this.m_instances)) { - format.InitHeaders(this.m_file, "IFCDOC_8_8"); + format.InitHeaders(this.m_file, "IFCDOC_9_4"); format.Save(); } break; @@ -1176,7 +1181,11 @@ private void toolStripMenuItemFileImport_Click(object sender, EventArgs e) try { format.Load(); - Program.ImportXsd((IfcDoc.Schema.XSD.schema)format.Instance, this.m_project); + DocSchema docSchema = Program.ImportXsd((IfcDoc.Schema.XSD.schema)format.Instance, this.m_project); + if(docSchema.Name == null) + { + docSchema.Name = System.IO.Path.GetFileNameWithoutExtension(filename); + } } catch(System.Exception xx) { @@ -1220,7 +1229,7 @@ private void ImportMVD(string filename) Program.ImportMvd(mvd, this.m_project, filename); break; } - catch (InvalidOperationException) + catch (InvalidOperationException xx) { // keep going until successful @@ -1453,7 +1462,7 @@ private void toolStripMenuItemFileExport_Click(object sender, EventArgs e) try { - DocumentationISO.DoExport(this.m_project, this.saveFileDialogExport.FileName, views, locales, this.m_instances, false); + DocumentationISO.DoExport(this.m_project, this.saveFileDialogExport.FileName, views, locales, this.m_instances); } catch (Exception x) { @@ -2625,6 +2634,14 @@ private void LoadTree() { LoadNode(tnModel, docExchange, docExchange.Name, false); } + + //temp: also load concept roots +#if false + foreach(DocConceptRoot docCR in docModel.ConceptRoots) + { + LoadNode(tnModel, docCR, docCR.ApplicableEntity.Name, false); + } +#endif } } } @@ -2854,6 +2871,8 @@ private void TreeView_AfterSelect(object sender, TreeViewEventArgs e) this.toolStripMenuItemContextInsertAbbreviatedTerm.Visible = false; this.toolStripMenuItemContextInsertPset.Visible = false; this.toolStripMenuItemContextInsertProperty.Visible = false; + this.toolStripMenuItemContextInsertPropertyEnum.Visible = false; + this.toolStripMenuItemContextInsertPropertyConstant.Visible = false; this.toolStripMenuItemContextInsertQset.Visible = false; this.toolStripMenuItemContextInsertQuantity.Visible = false; this.toolStripMenuItemContextInsertExample.Visible = false; @@ -3093,6 +3112,7 @@ private void TreeView_AfterSelect(object sender, TreeViewEventArgs e) this.toolStripMenuItemInsertPropertyset.Enabled = true; this.toolStripMenuItemInsertPropertyEnumeration.Enabled = true; this.toolStripMenuItemContextInsertPset.Visible = true; + this.toolStripMenuItemContextInsertPropertyEnum.Visible = true; this.toolStripMenuItemContextInsert.Visible = true; } else if (e.Node.Tag == typeof(DocQuantitySet)) @@ -3119,6 +3139,7 @@ private void TreeView_AfterSelect(object sender, TreeViewEventArgs e) this.toolStripMenuItemInsertPropertyEnumeration.Enabled = true; this.toolStripMenuItemContextInsertPset.Visible = true; + this.toolStripMenuItemContextInsertPropertyEnum.Visible = true; this.toolStripMenuItemContextInsertQset.Visible = true; this.toolStripMenuItemContextInsert.Visible = true; @@ -3200,6 +3221,18 @@ private void TreeView_AfterSelect(object sender, TreeViewEventArgs e) else if (obj is DocWhereRule) { this.toolStripMenuItemEditDelete.Enabled = true; + + DocWhereRule docAttr = (DocWhereRule)obj; + DocEntity docEnt = (DocEntity)e.Node.Parent.Tag; + if (docEnt.WhereRules.IndexOf(docAttr) > 0) + { + this.toolStripMenuItemEditMoveUp.Enabled = true; + } + + if (docEnt.WhereRules.IndexOf(docAttr) < docEnt.WhereRules.Count - 1) + { + this.toolStripMenuItemEditMoveDown.Enabled = true; + } } else if (obj is DocUniqueRule) { @@ -3223,6 +3256,17 @@ private void TreeView_AfterSelect(object sender, TreeViewEventArgs e) this.toolStripMenuItemContextInsertLeaf.Visible = true; this.toolStripMenuItemContextInsert.Visible = true; + + if(e.Node.Parent.Tag is DocModelView) + { + DocConceptRoot dcr = (DocConceptRoot)obj; + DocModelView dmv = (DocModelView)e.Node.Parent.Tag; + int indexof = dmv.ConceptRoots.IndexOf(dcr); + this.toolStripMenuItemEditMoveUp.Enabled = (indexof > 0); + this.toolStripMenuItemEditMoveDown.Enabled = (indexof < dmv.ConceptRoots.Count - 1); + } + + this.toolStripMenuItemEditBuildConcepts.Enabled = true; } else if(obj is DocPropertyConstant) { @@ -3283,6 +3327,8 @@ private void TreeView_AfterSelect(object sender, TreeViewEventArgs e) { this.toolStripMenuItemEditDelete.Enabled = true; this.toolStripMenuItemInsertPropertyConstant.Enabled = true; + this.toolStripMenuItemContextInsertPropertyConstant.Visible = true; + this.toolStripMenuItemContextInsert.Visible = true; } else if (obj is DocQuantitySet) { @@ -3504,7 +3550,7 @@ private void SetContent(DocObject obj, string content) if (obj is DocExample) { - imgnew = Properties.Settings.Default.OutputPath + "\\annex\\annex-e\\" + imgold; + imgnew = Properties.Settings.Default.OutputPath + "\\figures\\examples\\" + imgold; } content = content.Substring(0, i + 10) + imgnew + content.Substring(t); @@ -3557,8 +3603,15 @@ private void SetContent(DocObject obj, string content) this.ctlInheritance.Project = this.m_project; this.ctlInheritance.ModelView = docView; - this.ctlInheritance.Entity = this.m_project.GetDefinition("IfcRoot") as DocEntity; + if (!String.IsNullOrEmpty(docView.RootEntity)) + { + this.ctlInheritance.Entity = this.m_project.GetDefinition(docView.RootEntity) as DocEntity; + } + else + { + this.ctlInheritance.Entity = this.m_project.GetDefinition("IfcRoot") as DocEntity; + } this.ctlInheritance.Visible = true; this.ctlExpressG.Visible = false; this.ctlCheckGrid.Visible = false; @@ -4038,6 +4091,21 @@ private void MoveSelection(int direction) tnParent.Nodes.Insert(treeindex, tn); } } + else if(tn.Tag is DocConceptRoot) + { + DocModelView dmv = (DocModelView)tn.Parent.Tag; + DocConceptRoot dcr = (DocConceptRoot)tn.Tag; + + int index = dmv.ConceptRoots.IndexOf(dcr); + index += direction; + treeindex += direction; + + dmv.ConceptRoots.Remove(dcr); + dmv.ConceptRoots.Insert(index, dcr); + + tnParent.Nodes.Remove(tn); + tnParent.Nodes.Insert(treeindex, tn); + } else if (tn.Tag is DocTemplateUsage) { DocTemplateUsage docUsage = (DocTemplateUsage)tn.Tag; @@ -4149,6 +4217,22 @@ private void MoveSelection(int direction) tnParent.Nodes.Remove(tn); tnParent.Nodes.Insert(treeindex, tn); } + else if (tn.Tag is DocWhereRule) + { + DocEntity docEnt = (DocEntity)tn.Parent.Tag; + DocWhereRule docAttr = (DocWhereRule)tn.Tag; + + int index = docEnt.WhereRules.IndexOf(docAttr); + + index += direction; + treeindex += direction; + + docEnt.WhereRules.Remove(docAttr); + docEnt.WhereRules.Insert(index, docAttr); + + tnParent.Nodes.Remove(tn); + tnParent.Nodes.Insert(treeindex, tn); + } else if (tn.Tag is DocPropertySet) { DocPropertySet docProp = (DocPropertySet)tn.Tag; @@ -4340,7 +4424,7 @@ private void toolStripMenuItemEditPaste_Click(object sender, EventArgs e) if (this.treeView.Focused) { DocObject docSelect = this.treeView.SelectedNode.Tag as DocObject; - if (docSelect is DocSection && this.m_clipboard is DocSchema) + if (docSelect is DocSection && this.m_clipboard is DocSchema && this.m_clipboardNode.Parent is DocSection) { DocSchema docSchema = (DocSchema)this.m_clipboard; DocSection docSectionNew = (DocSection)docSelect; @@ -4427,25 +4511,9 @@ private void toolStripMenuItemEditPaste_Click(object sender, EventArgs e) DocTemplateUsage docSource = (DocTemplateUsage)this.m_clipboard; DocTemplateUsage docTarget = new DocTemplateUsage(); - docRoot.Concepts.Add(docTarget); - docTarget.Name = docSource.Name; - docTarget.Documentation = docSource.Documentation; - docTarget.Author = docSource.Author; - docTarget.Copyright = docSource.Copyright; - docTarget.Owner = docSource.Owner; - docTarget.Definition = docSource.Definition; - foreach (DocTemplateItem docSourceItem in docSource.Items) - { - DocTemplateItem docTargetItem = new DocTemplateItem(); - docTarget.Items.Add(docTargetItem); - - docTargetItem.Name = docSourceItem.Name; - docTargetItem.Documentation = docSourceItem.Documentation; - docTargetItem.RuleInstanceID = docSourceItem.RuleInstanceID; - docTargetItem.RuleParameters = docSourceItem.RuleParameters; - } + CopyTemplateUsage(docSource, docTarget); this.treeView.SelectedNode = LoadNode(this.treeView.SelectedNode, docTarget, docTarget.Name, false); } @@ -4502,6 +4570,41 @@ private void toolStripMenuItemEditPaste_Click(object sender, EventArgs e) } } + ///

    + /// Recursively copies concepts + /// + /// + /// + private static void CopyTemplateUsage(DocTemplateUsage docSource, DocTemplateUsage docTarget) + { + docTarget.Name = docSource.Name; + docTarget.Documentation = docSource.Documentation; + docTarget.Author = docSource.Author; + docTarget.Copyright = docSource.Copyright; + docTarget.Owner = docSource.Owner; + docTarget.Definition = docSource.Definition; + + foreach (DocTemplateItem docSourceItem in docSource.Items) + { + DocTemplateItem docTargetItem = new DocTemplateItem(); + docTarget.Items.Add(docTargetItem); + + docTargetItem.Name = docSourceItem.Name; + docTargetItem.Documentation = docSourceItem.Documentation; + docTargetItem.RuleInstanceID = docSourceItem.RuleInstanceID; + docTargetItem.RuleParameters = docSourceItem.RuleParameters; + docTargetItem.Optional = docSourceItem.Optional; + + foreach (DocTemplateUsage docSourceInner in docSourceItem.Concepts) + { + DocTemplateUsage docTargetInner = new DocTemplateUsage(); + docTargetItem.Concepts.Add(docTargetInner); + CopyTemplateUsage(docSourceInner, docTargetInner); + } + } + + } + private void ToolStripButtonEditCut_Click(object sender, EventArgs e) { ToolStripMenuItemEditCut_Click(sender, e); @@ -5023,7 +5126,11 @@ private void mergeToolStripMenuItem_Click(object sender, EventArgs e) using (FormMerge formMerge = new FormMerge(mapGuid, docProjectBase)) { - formMerge.ShowDialog(this); + res = formMerge.ShowDialog(this); + if(res == System.Windows.Forms.DialogResult.OK) + { + this.LoadTree(); + } } } @@ -5162,6 +5269,8 @@ private void InitInstanceList() this.ctlConcept.CurrentInstance = null; this.ctlProperties.CurrentInstance = null; + this.listViewValidate.Items.Clear(); + if (this.m_formatTest == null || this.m_assembly == null) { this.listViewValidate.Items.Clear(); @@ -5194,6 +5303,9 @@ private void InitInstanceList() else if(tnSelect.Tag is DocTemplateUsage) { docUsage = (DocTemplateUsage)tnSelect.Tag; + if (docUsage.Validation == null) + return; + docTemplate = (DocTemplateDefinition)docUsage.Definition; TreeNode tnTest = tnSelect.Parent; @@ -5227,7 +5339,6 @@ private void InitInstanceList() // return; this.treeView.Tag = typeFilter; - this.listViewValidate.Items.Clear(); if (typeFilter == null) return; @@ -5237,30 +5348,27 @@ private void InitInstanceList() { if (typeFilter == null || typeFilter.IsInstanceOfType(entity)) { - population.Add(entity); - - ListViewItem lvi = new ListViewItem(); - lvi.Tag = entity; - lvi.Text = entity.OID.ToString(); - lvi.SubItems.Add(entity.GetType().Name); + DocTemplateUsage docUsageForEntity = docUsage; // find the leaf-most template usage for the entity - if (docUsage == null && docTemplate != null) + if (docUsageForEntity == null && docTemplate != null && this.m_filterviews != null) { - DocEntity docSuper = docEntity; - while (docSuper != null && docUsage == null) + DocEntity docSuper = this.m_project.GetDefinition(entity.GetType().Name) as DocEntity;// docEntity; + while (docSuper != null && docUsageForEntity == null) { - foreach (DocModelView docView in this.m_project.ModelViews) + foreach (DocModelView docView in this.m_filterviews) { - //...TODO: check if view is in scope of validation... foreach (DocConceptRoot docRoot in docView.ConceptRoots) { - foreach(DocTemplateUsage docEachUsage in docRoot.Concepts) + if (docRoot.ApplicableEntity == docSuper) { - if (docEachUsage.Definition == docTemplate && docEachUsage.ValidationStructure.Count > 0) + foreach (DocTemplateUsage docEachUsage in docRoot.Concepts) { - docUsage = docEachUsage; - break; + if (docEachUsage.Definition == docTemplate && docEachUsage.ValidationStructure.Count > 0) + { + docUsageForEntity = docEachUsage; + break; + } } } } @@ -5271,46 +5379,44 @@ private void InitInstanceList() } // show rule results - if (docUsage != null && docUsage.ValidationStructure.ContainsKey(entity) && docUsage.ValidationConstraints.ContainsKey(entity)) + if (docUsageForEntity != null) { - bool valStruct = docUsage.ValidationStructure[entity]; - bool valConstr = docUsage.ValidationConstraints[entity]; + population.Add(entity); + + ListViewItem lvi = new ListViewItem(); + lvi.Tag = entity; + lvi.Text = entity.OID.ToString(); + lvi.SubItems.Add(entity.GetType().Name); - if(valStruct && valConstr) + bool? result = docUsageForEntity.GetResultForObject(entity); + + if(result != null && result.Value) { lvi.BackColor = Color.Lime; } - else if(!valConstr) + else { lvi.BackColor = Color.Red; } - else if(!valStruct) - { - lvi.BackColor = Color.Red;// Yellow; - } - } - else - { - lvi.BackColor = Color.Empty; - } - System.Reflection.FieldInfo field = entity.GetType().GetField("Name"); - if (field != null) - { - object oname = field.GetValue(entity); - if (oname != null) + System.Reflection.FieldInfo field = entity.GetType().GetField("Name"); + if (field != null) { - if(oname.GetType().IsValueType) + object oname = field.GetValue(entity); + if (oname != null) { - string name = oname.GetType().GetFields()[0].GetValue(oname) as string; - lvi.SubItems.Add(name); + if (oname.GetType().IsValueType) + { + string name = oname.GetType().GetFields()[0].GetValue(oname) as string; + lvi.SubItems.Add(name); + } } } - } - //... set icon as pass/fail... + //... set icon as pass/fail... - this.listViewValidate.Items.Add(lvi); + this.listViewValidate.Items.Add(lvi); + } } } @@ -5428,6 +5534,7 @@ private void backgroundWorkerValidate_DoWork(object sender, DoWorkEventArgs e) } int grandtotallist = 0; + int grandtotalskip = 0; int grandtotalpass = 0; StringBuilder sb = new StringBuilder(); @@ -5487,7 +5594,7 @@ private void backgroundWorkerValidate_DoWork(object sender, DoWorkEventArgs e) foreach (DocTemplateUsage docUsage in docRoot.Concepts) { - ValidateConcept(docUsage, docView, DocExchangeRequirementEnum.NotRelevant, typeEntity, list, sb, typemap, ref grandtotalpass, ref grandtotallist); + ValidateConcept(docUsage, docView, DocExchangeRequirementEnum.NotRelevant, typeEntity, list, sb, typemap, ref grandtotalpass, ref grandtotalskip, ref grandtotallist); } } } @@ -5511,7 +5618,7 @@ private void backgroundWorkerValidate_DoWork(object sender, DoWorkEventArgs e) int grandtotalpercent = 0; if (grandtotallist > 0) { - grandtotalpercent = 100 * grandtotalpass / grandtotallist; + grandtotalpercent = 100 * (grandtotalpass + grandtotalskip) / grandtotallist; } if (Properties.Settings.Default.ValidateReport) @@ -5538,6 +5645,7 @@ private void backgroundWorkerValidate_DoWork(object sender, DoWorkEventArgs e) writer.WriteLine("Exchange" + exchange + ""); writer.WriteLine("Tests Executed" + grandtotallist + ""); writer.WriteLine("Tests Passed" + grandtotalpass + ""); + writer.WriteLine("Tests Ignored" + grandtotalskip + ""); writer.WriteLine("Tests Percentage" + grandtotalpercent + "%"); writer.WriteLine(""); @@ -5565,7 +5673,7 @@ private void backgroundWorkerValidate_DoWork(object sender, DoWorkEventArgs e) /// Map of identifiers to compiled types /// The total tests passing (less than or equal to total tests executed). /// The total tests executed. - private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, DocExchangeRequirementEnum reqInherit, Type typeEntity, List list, StringBuilder sb, Dictionary typemap, ref int grandtotalpass, ref int grandtotallist) + private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, DocExchangeRequirementEnum reqInherit, Type typeEntity, List list, StringBuilder sb, Dictionary typemap, ref int grandtotalpass, ref int grandtotalskip, ref int grandtotallist) { if (docUsage.Definition == null || docUsage.Definition.IsDisabled || docUsage.Suppress) return; @@ -5649,8 +5757,18 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do DocModelRule[] parameterrules = docUsage.Definition.GetParameterRules(); + if (docUsage.Definition.Name.Contains("PCI-168")) + { + this.ToString(); + } + foreach (SEntity ent in list) { + if(docUsage.Definition.Name.Contains("-077") && ent.GetType().Name.Equals("IfcBuildingElementPart")) + { + this.ToString(); + } + object[] args = new object[0]; if (parameterrules != null && parameterrules.Length > 0) { @@ -5658,7 +5776,7 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do foreach (DocTemplateItem docItem in docUsage.Items) { - if (!docItem.Optional) + //if (!docItem.Optional) { trace.Clear(); @@ -5684,11 +5802,12 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do // report inner rules... foreach (DocTemplateItem docItemInner in docUsageInner.Items) { - if (!docItemInner.Optional) + sbDetail.Append(docItemInner.RuleParameters); + if (docItemInner.Optional) { - sbDetail.Append(docItemInner.RuleParameters); - sbDetail.Append("
    "); + sbDetail.Append("*"); } + sbDetail.Append("
    "); } } else @@ -5704,7 +5823,7 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do foreach (DocModelRule rule in docUsage.Definition.Rules) { trace.Clear(); - bool? itemresult = rule.Validate(ent, docItem, typemap, trace, ent); + bool? itemresult = rule.Validate(ent, docItem, typemap, trace, ent, docUsage); if (itemresult != null && !itemresult.Value && result != null) { result = false; @@ -5732,10 +5851,14 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do } docItem.ValidationStructure[ent] = false; - docUsage.ValidationStructure[ent] = false; - docUsage.Validation = false; - docUsage.Definition.Validation = false; - fail++; + + if (!docItem.Optional) + { + docUsage.ValidationStructure[ent] = false; + docUsage.Validation = false; + docUsage.Definition.Validation = false; + fail++; + } } else if (result != null && result.Value) { @@ -5744,6 +5867,21 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do { foreach (DocTemplateItem docInnerItem in docInnerConcept.Items) { + bool innerresult = false; + if(docInnerItem.ValidationStructure.TryGetValue(ent, out innerresult)) + { + if(!innerresult) + { + sbDetail.Append("~"); + sbDetail.Append(docInnerItem.RuleParameters); + sbDetail.Append("
    "); + + result = false; + fail++; + break; + } + } +#if false if (!docInnerItem.Optional && docInnerItem.ValidationStructure.Count == 0) { sbDetail.Append("~"); @@ -5751,13 +5889,16 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do sbDetail.Append("
    "); result = false; +#if false docItem.ValidationStructure[ent] = false; docUsage.ValidationStructure[ent] = false; docUsage.Validation = false; docUsage.Definition.Validation = false; +#endif fail++; break; } +#endif } } @@ -5859,6 +6000,8 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do sbDetail.AppendLine(""); } } + + // capture items that didn't match } else { @@ -5873,7 +6016,7 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do foreach (DocModelRule rule in docUsage.Definition.Rules) { trace.Clear(); - bool? itemresult = rule.Validate(ent, null, typemap, trace, ent); + bool? itemresult = rule.Validate(ent, null, typemap, trace, ent, docUsage); if (itemresult != null && !itemresult.Value) { result = false; @@ -6029,10 +6172,11 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do sbNested.AppendLine("

    Validation of concept groups (only one must pass):

    "); int subtotalpass = 0; + int subtotalskip = 0; int subtotallist = 0; foreach (DocTemplateUsage docSub in docUsage.Concepts) { - ValidateConcept(docSub, docView, reqInherit, typeEntity, list, sbNested, typemap, ref subtotalpass, ref subtotallist); + ValidateConcept(docSub, docView, reqInherit, typeEntity, list, sbNested, typemap, ref subtotalpass, ref subtotalskip, ref subtotallist); } if (subtotalpass > 0) @@ -6049,11 +6193,23 @@ private void ValidateConcept(DocTemplateUsage docUsage, DocModelView docView, Do sb.AppendLine("
    " + docUsage.Definition.Name); + + sb.Append(" (Operator: " + docUsage.Operator.ToString() + ")"); + + if(req == DocExchangeRequirementEnum.Optional) + { + sb.Append(" [OPTIONAL]"); + } if (fail > 0 || failRule > 0) { docUsage.Validation = false; docUsage.Definition.Validation = false; + if(req == DocExchangeRequirementEnum.Optional) + { + grandtotalskip++; + } + sb.AppendLine(" - [FAIL]"); } else @@ -6182,6 +6338,7 @@ private void UpdateTreeValidationNode(TreeNode tn) { if (tn.Tag is DocTemplateDefinition) { +#if true DocTemplateDefinition dtd = (DocTemplateDefinition)tn.Tag; if (dtd.Validation == null) { @@ -6195,10 +6352,63 @@ private void UpdateTreeValidationNode(TreeNode tn) { tn.BackColor = Color.Red; } +#endif } else if (tn.Tag is DocTemplateUsage) { - DocTemplateUsage dtd = (DocTemplateUsage)tn.Tag; + DocTemplateUsage docUsage = (DocTemplateUsage)tn.Tag; + if (docUsage.Validation != null) + { + TreeNode tnTest = tn.Parent; + while (tnTest.Tag is DocTemplateUsage) + { + tnTest = tnTest.Parent; + } + bool alltrue = true; + DocEntity docEntity = (DocEntity)tnTest.Parent.Tag; + DocSchema docSchema = this.m_project.GetSchemaOfDefinition(docEntity); + + if (docUsage.Definition.Name.Contains("053") && docEntity.Name.Equals("IfcWall")) + { + this.ToString(); + } + + if (docSchema != null && this.m_formatTest != null) + { + string typename = docSchema.Name + "." + docEntity.Name; + Type typeFilter = this.m_assembly.GetType(typename); + if (typeFilter != null) + { + foreach (SEntity entity in this.m_formatTest.Instances.Values) + { + if (typeFilter.IsInstanceOfType(entity)) + { + bool? result = docUsage.GetResultForObject(entity); + if (result != null && !result.Value) + { + alltrue = false; + break; + } + } + } + } + + } + + if (alltrue) + { + tn.BackColor = Color.Lime; + } + else + { + tn.BackColor = Color.Red; + } + } + else + { + tn.BackColor = Color.Empty; + } +#if false if (dtd.Validation == null) { tn.BackColor = Color.Empty; @@ -6211,6 +6421,7 @@ private void UpdateTreeValidationNode(TreeNode tn) { tn.BackColor = Color.Red; } +#endif } foreach (TreeNode sub in tn.Nodes) @@ -6480,19 +6691,20 @@ private void toolStripMenuItemInsertAttribute_Click(object sender, EventArgs e) } } - if (docAttr.DiagramLine.Count == 0) + if (docAttr.DiagramLine.Count == 0 && docAttr.Definition.DiagramRectangle != null) { docAttr.DiagramLine.Add(new DocPoint(docEntity.DiagramRectangle.X + docEntity.DiagramRectangle.Width, docAttr.Definition.DiagramRectangle.Y + docAttr.Definition.DiagramRectangle.Height / 2)); docAttr.DiagramLine.Add(new DocPoint(docAttr.Definition.DiagramRectangle.X, docAttr.Definition.DiagramRectangle.Y + docAttr.Definition.DiagramRectangle.Height / 2)); - } - docAttr.DiagramLabel = new DocRectangle(); - docAttr.DiagramLabel.X = docAttr.DiagramLine[0].X; - docAttr.DiagramLabel.Y = docAttr.DiagramLine[0].Y; - docAttr.DiagramLabel.Width = 400.0; - docAttr.DiagramLabel.Height = 50.0; + docAttr.DiagramLabel = new DocRectangle(); + docAttr.DiagramLabel.X = docAttr.DiagramLine[0].X; + docAttr.DiagramLabel.Y = docAttr.DiagramLine[0].Y; + docAttr.DiagramLabel.Width = 400.0; + docAttr.DiagramLabel.Height = 50.0; - this.treeView.SelectedNode = this.LoadNode(tnParent, docAttr, docAttr.ToString(), false); + } + + this.treeView.SelectedNode = this.LoadNode(tnParent, docAttr, docAttr.ToString(), false, docEntity.Attributes.Count - 1); toolStripMenuItemEditRename_Click(this, e); } @@ -6537,11 +6749,14 @@ private void toolStripMenuItemInsertWhere_Click(object sender, EventArgs e) { DocWhereRule docAttr = new DocWhereRule(); + int offset = -1; TreeNode tnParent = this.treeView.SelectedNode; if (tnParent.Tag is DocEntity) { DocEntity docEntity = (DocEntity)tnParent.Tag; docEntity.WhereRules.Add(docAttr); + + offset = docEntity.Attributes.Count + docEntity.WhereRules.Count - 1; } else if(tnParent.Tag is DocDefined) { @@ -6549,7 +6764,7 @@ private void toolStripMenuItemInsertWhere_Click(object sender, EventArgs e) docDefined.WhereRules.Add(docAttr); } - this.treeView.SelectedNode = this.LoadNode(tnParent, docAttr, docAttr.ToString(), false); + this.treeView.SelectedNode = this.LoadNode(tnParent, docAttr, docAttr.ToString(), false, offset); toolStripMenuItemEditRename_Click(this, e); } @@ -6587,12 +6802,18 @@ private void toolStripMenuItemInsertPropertyEnumeration_Click(object sender, Eve { TreeNode tnParent = this.treeView.SelectedNode; - if (tnParent.Tag is DocSchema) + TreeNode tn = tnParent; + if (tn.Parent.Tag is DocSchema) { - DocSchema docSchema = (DocSchema)tnParent.Tag; + tn = tn.Parent; + } + + if (tn.Tag is DocSchema) + { + DocSchema docSchema = (DocSchema)tn.Tag; DocPropertyEnumeration docType = new DocPropertyEnumeration(); docSchema.PropertyEnums.Add(docType); - this.treeView.SelectedNode = this.LoadNode(tnParent.Nodes[4], docType, null, true); + this.treeView.SelectedNode = this.LoadNode(tn.Nodes[4], docType, null, true); toolStripMenuItemEditRename_Click(this, e); } } @@ -7325,7 +7546,10 @@ private void toolStripMenuItemDiagramFormatPageRef_Click(object sender, EventArg listPages.Add(docPageSource.DiagramNumber, docPageSource.DiagramNumber); } - docPageSource.Name = docPageTarget.Name + " " + docPageTarget.Definition.Name; + if (docPageTarget.Definition != null) // older files didn't have this + { + docPageSource.Name = docPageTarget.Name + " " + docPageTarget.Definition.Name; + } } docPageTarget.Name += "("; @@ -7813,131 +8037,126 @@ private void ctlCheckGrid_SelectionChanged(object sender, EventArgs e) } } - private void toolStripMenuItemEditBuildConcepts_Click(object sender, EventArgs e) + private void BuildConceptForPropertySets(DocConceptRoot docRoot, DocTemplateDefinition docTemplatePset, DocPropertySet[] psets) { - if (MessageBox.Show(this, "This will create or update concepts within the selected model view to include all applicable property sets for entities within scope. " + - "This will also add the required templates for the project if they do not already exist. Click OK to proceed.", "Generate Concepts", MessageBoxButtons.OKCancel) != DialogResult.OK) - return; + DocTemplateUsage docConcept = null; - DocTemplateDefinition docTemplatePset = this.m_project.GetTemplate(new Guid("f74255a6-0c0e-4f31-84ad-24981db62461")); - if(docTemplatePset == null) + // get any existing concept for psets + foreach (DocTemplateUsage docExistConcept in docRoot.Concepts) { - // import it - string filepath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\defaults.mvdxml"; - this.ImportMVD(filepath); - docTemplatePset = this.m_project.GetTemplate(new Guid("f74255a6-0c0e-4f31-84ad-24981db62461")); - if(docTemplatePset == null) + if (docExistConcept.Definition == docTemplatePset) { - MessageBox.Show(this, "The required file information is missing. You may need to re-download the application from www.buildingsmart-tech.org."); - return; + docConcept = docExistConcept; + break; } } - DocModelView docView = (DocModelView)this.treeView.SelectedNode.Tag; - foreach (DocConceptRoot docRoot in docView.ConceptRoots) + if (psets.Length > 0) { - List listPsets = new List(); + if (docConcept == null) + { + docConcept = new DocTemplateUsage(); + docConcept.Definition = docTemplatePset; + docRoot.Concepts.Add(docConcept); - // find all applicable property sets for entity - foreach (DocSection docSection in this.m_project.Sections) + LoadNode(this.treeView.SelectedNode, docConcept, docConcept.Name, false); + } + + // remove old listings + for (int iExist = docConcept.Items.Count - 1; iExist >= 0; iExist--) { - foreach (DocSchema docSchema in docSection.Schemas) + docConcept.Items[iExist].Delete(); + docConcept.Items.RemoveAt(iExist); + } + + foreach (DocPropertySet docPset in psets) + { + //if (docPset.PropertySetType == "PSET_OCCURRENCEDRIVEN" || + // docPset.PropertySetType == "PSET_TYPEDRIVENOVERRIDE") { - foreach (DocPropertySet docPset in docSchema.PropertySets) + // add new, in order + DocTemplateItem docItemPset = new DocTemplateItem(); + docItemPset.RuleParameters = "Name=" + docPset.Name + ";"; + docConcept.Items.Add(docItemPset); + + //... predefined type + + //... properties... + foreach (DocProperty docProp in docPset.Properties) { - if (docPset.ApplicableType != null) + DocTemplateDefinition docInnerTemplate = null; + switch (docProp.PropertyType) { - string[] types = docPset.ApplicableType.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); - foreach (string type in types) - { - string[] parts = type.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries); - if (parts.Length == 1) // no predefined type requirement - { - if (parts[0].Equals(docRoot.ApplicableEntity.Name)) - { - listPsets.Add(docPset); - break; - } - } - } + case DocPropertyTemplateTypeEnum.P_SINGLEVALUE: + docInnerTemplate = this.m_project.GetTemplate(new Guid("6655f6d0-29a8-47b8-8f3d-c9fce9c9a620")); + break; + + case DocPropertyTemplateTypeEnum.P_BOUNDEDVALUE: + docInnerTemplate = this.m_project.GetTemplate(new Guid("3d67a2d2-761d-44d9-a09e-b7fbb1fa5632")); + break; + + case DocPropertyTemplateTypeEnum.P_ENUMERATEDVALUE: + docInnerTemplate = this.m_project.GetTemplate(new Guid("c148a099-c351-43a8-9266-5f3de0b45a95")); + break; + } + + if (docInnerTemplate != null) + { + DocTemplateUsage docInnerConcept = docItemPset.RegisterParameterConcept("Properties", docInnerTemplate); + DocTemplateItem docInnerItem = new DocTemplateItem(); + docInnerItem.RuleParameters = "Name=" + docProp.Name + ";Value=" + docProp.PrimaryDataType + ";"; + docInnerConcept.Items.Add(docInnerItem); } } } } + } + } - DocTemplateUsage docConcept = null; - - // get any existing concept for psets - foreach (DocTemplateUsage docExistConcept in docRoot.Concepts) + private void toolStripMenuItemEditBuildConcepts_Click(object sender, EventArgs e) + { + DocTemplateDefinition docTemplatePset = this.m_project.GetTemplate(new Guid("f74255a6-0c0e-4f31-84ad-24981db62461")); + if(docTemplatePset == null) + { + // import it + string filepath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location) + @"\defaults.mvdxml"; + this.ImportMVD(filepath); + docTemplatePset = this.m_project.GetTemplate(new Guid("f74255a6-0c0e-4f31-84ad-24981db62461")); + if(docTemplatePset == null) { - if (docExistConcept.Definition == docTemplatePset) - { - docConcept = docExistConcept; - break; - } + MessageBox.Show(this, "The required file information is missing. You may need to re-download the application from www.buildingsmart-tech.org."); + return; } + } - if (listPsets.Count > 0) - { - if (docConcept == null) - { - docConcept = new DocTemplateUsage(); - docConcept.Definition = docTemplatePset; - docRoot.Concepts.Add(docConcept); - } + // select property sets within dialog + DocConceptRoot docRoot = null; + DocEntity docEntity = null; // all properties + if(this.treeView.SelectedNode.Tag is DocConceptRoot) + { + docRoot = (DocConceptRoot)this.treeView.SelectedNode.Tag; + docEntity = docRoot.ApplicableEntity; + } - // remove old listings - for (int iExist = docConcept.Items.Count - 1; iExist >= 0; iExist--) + using (FormSelectProperty form = new FormSelectProperty(docEntity, this.m_project, true)) + { + if (form.ShowDialog(this) == System.Windows.Forms.DialogResult.OK) + { + if (docRoot != null) { - docConcept.Items[iExist].Delete(); - docConcept.Items.RemoveAt(iExist); + this.BuildConceptForPropertySets(docRoot, docTemplatePset, form.IncludedPropertySets); } - - foreach (DocPropertySet docPset in listPsets) + else { - if (docPset.PropertySetType == "PSET_OCCURRENCEDRIVEN" || - docPset.PropertySetType == "PSET_TYPEDRIVENOVERRIDE") + // all entities + DocModelView docView = (DocModelView)this.treeView.SelectedNode.Tag; + foreach (DocConceptRoot docEachRoot in docView.ConceptRoots) { - // add new, in order - DocTemplateItem docItemPset = new DocTemplateItem(); - docItemPset.RuleParameters = "Name=" + docPset.Name + ";"; - docConcept.Items.Add(docItemPset); - - //... predefined type - - //... properties... - foreach (DocProperty docProp in docPset.Properties) - { - DocTemplateDefinition docInnerTemplate = null; - switch(docProp.PropertyType) - { - case DocPropertyTemplateTypeEnum.P_SINGLEVALUE: - docInnerTemplate = this.m_project.GetTemplate(new Guid("6655f6d0-29a8-47b8-8f3d-c9fce9c9a620")); - break; - - case DocPropertyTemplateTypeEnum.P_BOUNDEDVALUE: - docInnerTemplate = this.m_project.GetTemplate(new Guid("3d67a2d2-761d-44d9-a09e-b7fbb1fa5632")); - break; - - case DocPropertyTemplateTypeEnum.P_ENUMERATEDVALUE: - docInnerTemplate = this.m_project.GetTemplate(new Guid("c148a099-c351-43a8-9266-5f3de0b45a95")); - break; - } - - if (docInnerTemplate != null) - { - DocTemplateUsage docInnerConcept = docItemPset.RegisterParameterConcept("Properties", docInnerTemplate); - DocTemplateItem docInnerItem = new DocTemplateItem(); - docInnerItem.RuleParameters = "Name=" + docProp.Name + ";Value=" + docProp.PrimaryDataType + ";"; - docInnerConcept.Items.Add(docInnerItem); - } - } + this.BuildConceptForPropertySets(docEachRoot, docTemplatePset, form.IncludedPropertySets); } } } } - - this.LoadTree(); } private void ctlProperties_RuleContentChanged(object sender, EventArgs e) @@ -7993,6 +8212,110 @@ private void listViewValidate_SelectedIndexChanged(object sender, EventArgs e) this.ctlConcept.CurrentInstance = entity; this.ctlProperties.CurrentInstance = entity; + + this.treeViewInstance.Nodes.Clear(); + LoadInstance(null, entity); + } + + private void LoadInstance(TreeNode tnParent, SEntity instance) + { + if (instance == null) + return; + + // recursion stop limit (if user hits star button) + if (tnParent != null && tnParent.Level > 32) + return; + + + if (tnParent != null && tnParent.Nodes.Count > 0 && tnParent.Nodes[0].Tag != null) + { + return; + } + + if (tnParent != null) + { + tnParent.Nodes.Clear(); // remove placeholder + } + + Dictionary mapEntity = new Dictionary(); + Dictionary mapSchema = new Dictionary(); + BuildMaps(mapEntity, mapSchema); + + Type t = instance.GetType(); + DocDefinition docDef = this.m_project.GetDefinition(t.Name); + if (docDef is DocEntity) + { + DocEntity docEntity = (DocEntity)docDef; + List listAttr = new List(); + FormatPNG.BuildAttributeList(docEntity, listAttr, mapEntity); + foreach (DocAttribute docAttr in listAttr) + { + object value = null; + System.Reflection.FieldInfo field = t.GetField(docAttr.Name); + if (field != null) + { + value = field.GetValue(instance); + + // drill into underlying value + if (value != null && !(value is SEntity)) + { + System.Reflection.FieldInfo fValue = value.GetType().GetField("Value"); + if (fValue != null) + { + value = fValue.GetValue(value); + } + } + } + + if (value != null) + { + TreeNode tn = new TreeNode(); + tn.Tag = docAttr; + tn.Text = docAttr.Name; + if (value is SEntity) + { + tn.Text += " = " + value.GetType().Name;//((SEntity)value).OID; + } + else if (value is System.Collections.IList) + { + System.Collections.IList list = (System.Collections.IList)value; + tn.Text += " = [" + list.Count + "]"; + } + else if (value != null) + { + tn.Text += " = " + value.ToString(); + } + + if (tnParent != null) + { + tnParent.Nodes.Add(tn); + } + else + { + this.treeViewInstance.Nodes.Add(tn); + } + + if (value is SEntity) + { + LoadInstance(tn, (SEntity)value); + } + else if (value is System.Collections.IList) + { + System.Collections.IList list = (System.Collections.IList)value; + for (int i = 0; i < list.Count; i++) + { + TreeNode tnItem = new TreeNode(); + tnItem.Tag = list[i]; + tnItem.Text = (i + 1).ToString() + " = " + list[i].GetType().Name; + tn.Nodes.Add(tnItem); + + TreeNode tnNull = new TreeNode(); + tnItem.Nodes.Add(tnNull); + } + } + } + } + } } private void buildFromSubschemaToolStripMenuItem_Click(object sender, EventArgs e) @@ -8068,6 +8391,30 @@ private void ctlProperties_Navigate(object sender, EventArgs e) } } } + else if(this.ctlProperties.SelectedUsage != null && this.ctlProperties.SelectedUsage.Length == 1 && this.ctlProperties.SelectedUsage[0] is DocTemplateDefinition) + { + DocTemplateDefinition dtd = (DocTemplateDefinition)this.ctlProperties.SelectedUsage[0]; + + this.Navigate(this.treeView.Nodes[3], dtd); + } + } + + /// + /// Navigates to item in tree corresponding to object + /// + /// + private void Navigate(TreeNode tn, DocObject docObj) + { + if (tn.Tag == docObj) + { + this.treeView.SelectedNode = tn; + return; + } + + foreach(TreeNode sub in tn.Nodes) + { + Navigate(sub, docObj); + } } private void treeView_ItemDrag(object sender, ItemDragEventArgs e) @@ -8075,5 +8422,17 @@ private void treeView_ItemDrag(object sender, ItemDragEventArgs e) TreeNode tn = (TreeNode)e.Item; this.DoDragDrop(tn.Tag, DragDropEffects.Move); } + + private void treeViewInstance_BeforeExpand(object sender, TreeViewCancelEventArgs e) + { + TreeNode tn = e.Node; + if(tn.Tag is SEntity) + { + SEntity ent = (SEntity)tn.Tag; + LoadInstance(tn, ent); + } + + e.Cancel = false; + } } } diff --git a/FormEdit.resx b/FormEdit.resx index 96438ef7..cc1d1345 100644 --- a/FormEdit.resx +++ b/FormEdit.resx @@ -411,6 +411,53 @@ False + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAEnSURBVDhPYxjm4Pvb8/8f7wsA40d7/f/f2+H5/8YGx/+X + Vlr8P7PI8P+jiyv/Q5ViByCN398u+//19YL/X57P/P/p8cT/H+91/n93o/7/60ul/9ty3Akb8O31/P9f + ns38X9W9/H9+45z/6VVT/7++WPz/5enM/41pzoQN+PJsxv9PD/v/v7/T+v/ttZr/ry4W/X95Kv3/06Mx + /2uTHCAGEPLrzf2Z/6t6lv3Pa5wNdsHTw1FgtVVxNhADQBxCfn11Pv//8xMpQM2RYEsebHf5Xx5liTCA + kF8nVgb97y70+d+S6fq/Lsn+f0WM1f/TBzYjDCDKr7jAoz1+/z8+6Pv//nYrfr/iAveBgfb+dvP/N1cq + 8fsVFwClqPkdcf9nNkTg9+sgBAwMANsQU5TL62k1AAAAAElFTkSuQmCC + + + + Magenta + + + 196, 22 + + + Property Enumeration + + + False + + + + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 + YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAFeSURBVDhP7ZHdK4NhGMbf/8mBpFBKKzU1RKKUzFoRSeJg + FOWrRtGSz9rQhlnYshiSTbT3QBtlw0Z7xxR24N0yU5fneTa0ev4B5Tr/XR/3LfwrV1e3D7DYz2C0ujFr + PsSkcQ/6OQdGprcwOGVF37gZPaMmOPZPkUVytUrgb32kPyEn3vEcf0P08RU3dzFcBCIQ/WGou/V8A5PN + w+A0gRPJFIFlSAS+vn+CPyBB9IXgEYNoaB/mG8xbjhgsJ2myDJVah+KqNuQpmkhyCG4CuzyXqNb08w0M + JheDX0htKRYntWlyBF5SmyZT2HFwDmVjL99gYmGHbZZimc2qZh1Ksg0obCfwutOLsrpOvsHYzDaiFCab + 2cF84Z/aNNnqFLG8eYKiyla+wZDBlqkdpNf+3UxhmrxC4MW1YxQoNXwD+l964VrtAKtPtyrqu1Ba08FS + Cyu0yC9vwdLGLt/gL0oQvgBfyDULH4KzUwAAAABJRU5ErkJggg== + + + + Magenta + + + 196, 22 + + + Property Constant + + + False + iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8 @@ -521,7 +568,7 @@ - 112, 22 + 152, 22 &Insert @@ -530,7 +577,7 @@ Fuchsia - 112, 22 + 152, 22 Disable @@ -539,7 +586,7 @@ False - 109, 6 + 149, 6 False @@ -561,13 +608,13 @@ - 112, 22 + 152, 22 &Delete - 113, 76 + 153, 98 contextMenuStrip @@ -589,7 +636,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAQ - fwAAAk1TRnQBSQFMAgEBKgEAAZQBBAGUAQQBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA + fwAAAk1TRnQBSQFMAgEBKgEAAcwBBAHMAQQBEAEAARABAAT/ARkBAAj/AUIBTQE2BwABNgMAASgDAAFA AwABsAMAAQEBAAEYBgABhP8A/wBdABv2EgAn9mwAA/YJQgP2CUID9hIAA/YGQgP2A0ID9gNCA/YDQgP2 BkID9mwAA/YDQgP2A0ID9gNCA/YDQgP2EgAD9gNCG/YDQgP2bAAD9glCA/YDQgP2A0ID9hIAA/YDQgP2 A0ID9gNCA/YJQgP2A0ID9mwACfYDQgP2A0ID9gNCA/YSAAn2A0ID9gNCA/YDQgP2A0IJ9mwAA/YJQgP2 @@ -1150,7 +1197,7 @@ treeView - IfcDoc.ThemedTreeView, IfcDoc, Version=8.7.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.ThemedTreeView, IfcDoc, Version=9.2.0.0, Culture=neutral, PublicKeyToken=null splitContainerRoot.Panel1 @@ -1207,7 +1254,7 @@ ctlConcept - IfcDoc.CtlConcept, IfcDoc, Version=8.7.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.CtlConcept, IfcDoc, Version=9.2.0.0, Culture=neutral, PublicKeyToken=null splitContainerWorkspace.Panel1 @@ -1243,7 +1290,7 @@ ctlExpressG - IfcDoc.CtlExpressG, IfcDoc, Version=8.7.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.CtlExpressG, IfcDoc, Version=9.2.0.0, Culture=neutral, PublicKeyToken=null splitContainerWorkspace.Panel1 @@ -1273,7 +1320,7 @@ ctlCheckGrid - IfcDoc.CtlCheckGrid, IfcDoc, Version=8.7.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.CtlCheckGrid, IfcDoc, Version=9.2.0.0, Culture=neutral, PublicKeyToken=null splitContainerWorkspace.Panel1 @@ -1303,7 +1350,7 @@ ctlInheritance - IfcDoc.CtlInheritance, IfcDoc, Version=8.7.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.CtlInheritance, IfcDoc, Version=9.2.0.0, Culture=neutral, PublicKeyToken=null splitContainerWorkspace.Panel1 @@ -1339,7 +1386,7 @@ ctlProperties - IfcDoc.CtlProperties, IfcDoc, Version=8.7.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.CtlProperties, IfcDoc, Version=9.2.0.0, Culture=neutral, PublicKeyToken=null splitContainerWorkspace.Panel2 @@ -1509,6 +1556,15 @@ 0 + + Fill + + + 0, 25 + + + Horizontal + # @@ -1522,10 +1578,10 @@ Fill - 0, 25 + 0, 0 - 221, 490 + 221, 245 191, 95 @@ -1535,7 +1591,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABy - CwAAAk1TRnQBSQFMAgEBBAEAAXABAAFwAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CwAAAk1TRnQBSQFMAgEBBAEAAagBAAGoAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -1596,11 +1652,80 @@ System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - splitContainerEdit.Panel2 + splitContainerInstances.Panel1 0 + + splitContainerInstances.Panel1 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainerInstances + + + 0 + + + Fill + + + 0, 0 + + + 221, 241 + + + 0 + + + treeViewInstance + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainerInstances.Panel2 + + + 0 + + + splitContainerInstances.Panel2 + + + System.Windows.Forms.SplitterPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainerInstances + + + 1 + + + 221, 490 + + + 245 + + + 3 + + + splitContainerInstances + + + System.Windows.Forms.SplitContainer, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + splitContainerEdit.Panel2 + + + 0 + 673, 95 @@ -2284,7 +2409,7 @@ - 152, 22 + 147, 22 &Web View @@ -2297,7 +2422,7 @@ - 152, 22 + 147, 22 &Text View @@ -2311,7 +2436,7 @@ - 152, 22 + 147, 22 &Diagram View @@ -2942,7 +3067,7 @@ Fuchsia - 172, 22 + 171, 22 Concept &Template @@ -2951,7 +3076,7 @@ Adds a concept template to the documentation (in Section 4), which may be instantiated as use definitions at applicable entities. - 169, 6 + 168, 6 @@ -2972,7 +3097,7 @@ Fuchsia - 172, 22 + 171, 22 &Model View @@ -2998,7 +3123,7 @@ Fuchsia - 172, 22 + 171, 22 &Exchange @@ -3024,7 +3149,7 @@ - 172, 22 + 171, 22 Concept &Root @@ -3049,7 +3174,7 @@ Fuchsia - 172, 22 + 171, 22 &Concept... @@ -3384,7 +3509,7 @@ Generate &Module... - 48, 20 + 47, 20 &Tools @@ -4014,7 +4139,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAABO - CwAAAk1TRnQBSQFMAgEBBQEAARABAwEQAQMBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CwAAAk1TRnQBSQFMAgEBBQEAAUgBAwFIAQMBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAASADAAEBAQABCAYAAQgYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA @@ -4086,6 +4211,9 @@ True + + 166 + 964, 564 @@ -5499,6 +5627,18 @@ System.Windows.Forms.OpenFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + toolStripMenuItemContextInsertPropertyEnum + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + toolStripMenuItemContextInsertPropertyConstant + + + System.Windows.Forms.ToolStripMenuItem, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + FormEdit diff --git a/FormMerge.Designer.cs b/FormMerge.Designer.cs index ec9da9b5..c0499a44 100644 --- a/FormMerge.Designer.cs +++ b/FormMerge.Designer.cs @@ -29,30 +29,23 @@ protected override void Dispose(bool disposing) private void InitializeComponent() { System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormMerge)); - this.textBoxOriginal = new System.Windows.Forms.TextBox(); - this.textBoxChange = new System.Windows.Forms.TextBox(); this.label3 = new System.Windows.Forms.Label(); this.radioButtonOriginal = new System.Windows.Forms.RadioButton(); this.radioButtonChange = new System.Windows.Forms.RadioButton(); this.buttonOK = new System.Windows.Forms.Button(); this.buttonCancel = new System.Windows.Forms.Button(); this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.lvDestination = new System.Windows.Forms.ListView(); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.lvSource = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.treeView = new System.Windows.Forms.TreeView(); + this.label1 = new System.Windows.Forms.Label(); this.tableLayoutPanel1.SuspendLayout(); this.SuspendLayout(); // - // textBoxOriginal - // - resources.ApplyResources(this.textBoxOriginal, "textBoxOriginal"); - this.textBoxOriginal.Name = "textBoxOriginal"; - this.textBoxOriginal.ReadOnly = true; - // - // textBoxChange - // - resources.ApplyResources(this.textBoxChange, "textBoxChange"); - this.textBoxChange.Name = "textBoxChange"; - this.textBoxChange.ReadOnly = true; - // // label3 // resources.ApplyResources(this.label3, "label3"); @@ -91,12 +84,58 @@ private void InitializeComponent() // tableLayoutPanel1 // resources.ApplyResources(this.tableLayoutPanel1, "tableLayoutPanel1"); - this.tableLayoutPanel1.Controls.Add(this.textBoxOriginal, 0, 1); - this.tableLayoutPanel1.Controls.Add(this.textBoxChange, 1, 1); + this.tableLayoutPanel1.Controls.Add(this.lvDestination, 1, 2); this.tableLayoutPanel1.Controls.Add(this.radioButtonChange, 1, 0); this.tableLayoutPanel1.Controls.Add(this.radioButtonOriginal, 0, 0); + this.tableLayoutPanel1.Controls.Add(this.lvSource, 0, 2); this.tableLayoutPanel1.Name = "tableLayoutPanel1"; // + // lvDestination + // + this.lvDestination.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader3, + this.columnHeader4}); + resources.ApplyResources(this.lvDestination, "lvDestination"); + this.lvDestination.FullRowSelect = true; + this.lvDestination.HideSelection = false; + this.lvDestination.MultiSelect = false; + this.lvDestination.Name = "lvDestination"; + this.lvDestination.UseCompatibleStateImageBehavior = false; + this.lvDestination.View = System.Windows.Forms.View.Details; + this.lvDestination.SelectedIndexChanged += new System.EventHandler(this.lvDestination_SelectedIndexChanged); + this.lvDestination.Resize += new System.EventHandler(this.lvDestination_Resize); + // + // columnHeader3 + // + resources.ApplyResources(this.columnHeader3, "columnHeader3"); + // + // columnHeader4 + // + resources.ApplyResources(this.columnHeader4, "columnHeader4"); + // + // lvSource + // + this.lvSource.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2}); + resources.ApplyResources(this.lvSource, "lvSource"); + this.lvSource.FullRowSelect = true; + this.lvSource.HideSelection = false; + this.lvSource.MultiSelect = false; + this.lvSource.Name = "lvSource"; + this.lvSource.UseCompatibleStateImageBehavior = false; + this.lvSource.View = System.Windows.Forms.View.Details; + this.lvSource.SelectedIndexChanged += new System.EventHandler(this.lvSource_SelectedIndexChanged); + this.lvSource.Resize += new System.EventHandler(this.lvSource_Resize); + // + // columnHeader1 + // + resources.ApplyResources(this.columnHeader1, "columnHeader1"); + // + // columnHeader2 + // + resources.ApplyResources(this.columnHeader2, "columnHeader2"); + // // treeView // resources.ApplyResources(this.treeView, "treeView"); @@ -105,12 +144,18 @@ private void InitializeComponent() this.treeView.AfterCheck += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterCheck); this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect); // + // label1 + // + resources.ApplyResources(this.label1, "label1"); + this.label1.Name = "label1"; + // // FormMerge // this.AcceptButton = this.buttonOK; resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.buttonCancel; + this.Controls.Add(this.label1); this.Controls.Add(this.treeView); this.Controls.Add(this.tableLayoutPanel1); this.Controls.Add(this.buttonCancel); @@ -129,8 +174,6 @@ private void InitializeComponent() #endregion - private System.Windows.Forms.TextBox textBoxOriginal; - private System.Windows.Forms.TextBox textBoxChange; private System.Windows.Forms.Label label3; private System.Windows.Forms.RadioButton radioButtonOriginal; private System.Windows.Forms.RadioButton radioButtonChange; @@ -138,5 +181,12 @@ private void InitializeComponent() private System.Windows.Forms.Button buttonCancel; private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.TreeView treeView; + private System.Windows.Forms.ListView lvDestination; + private System.Windows.Forms.ColumnHeader columnHeader3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ListView lvSource; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.Label label1; } } \ No newline at end of file diff --git a/FormMerge.cs b/FormMerge.cs index fe47dcff..f9810095 100644 --- a/FormMerge.cs +++ b/FormMerge.cs @@ -5,7 +5,10 @@ // Copyright: (c) 2012 BuildingSmart International Ltd. // License: http://www.buildingsmart-tech.org/legal +// Portions of code within this file originated from DifferenceEngine on CodeProject.org (file containing referenced data definitions). + using System; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; @@ -15,11 +18,14 @@ using IfcDoc.Schema.DOC; +using DifferenceEngine; + namespace IfcDoc { public partial class FormMerge : Form { bool m_ignore; + Dictionary m_mapOriginal; public FormMerge() { @@ -30,6 +36,8 @@ public FormMerge() public FormMerge(Dictionary mapOriginal, DocProject docChange) : this() { + this.m_mapOriginal = mapOriginal; + // add nodes for everything, then delete ones that haven't changed or don't have any children // iterate and find changes in documentation @@ -52,42 +60,142 @@ public FormMerge(Dictionary mapOriginal, DocProject docChange) DocObject docOriginalType = null; if (mapOriginal.TryGetValue(docChangeType.Uuid, out docOriginalType)) { + TreeNode tnType = null; + if (!String.Equals(docOriginalType.Documentation, docChangeType.Documentation)) { - this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalType.Name, docOriginalType, docChangeType)); + tnType = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalType.Name, docOriginalType, docChangeType)); + } + + if (docChangeType is DocEnumeration) + { + DocEnumeration docChangeEnum = (DocEnumeration)docChangeType; + foreach (DocConstant docChangeConst in docChangeEnum.Constants) + { + DocObject docOriginalConst = null; + if (mapOriginal.TryGetValue(docChangeConst.Uuid, out docOriginalConst)) + { + if (!String.Equals(docOriginalConst.Documentation, docChangeConst.Documentation)) + { + if (tnType == null) + { + tnType = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalType.Name, docOriginalType, docChangeType)); + } + this.AddNode(tnType, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalType.Name + "." + docOriginalConst.Name, docOriginalConst, docChangeConst)); + } + } + else + { + if (tnType == null) + { + tnType = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalType.Name, docOriginalType, docChangeType)); + } + + // NEW: + this.AddNode(tnType, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalType.Name + "." + docOriginalConst.Name, null, docChangeConst)); + } + } } } } foreach (DocEntity docChangeEntity in docChangeSchema.Entities) { - DocObject docOriginalEntity = null; - if (mapOriginal.TryGetValue(docChangeEntity.Uuid, out docOriginalEntity)) + DocObject docOriginalObj = null; + if (mapOriginal.TryGetValue(docChangeEntity.Uuid, out docOriginalObj)) { + DocEntity docOriginalEntity = (DocEntity)docOriginalObj; TreeNode tnEntity = null; - if (!String.Equals(((DocEntity)docOriginalEntity).Documentation, docChangeEntity.Documentation)) // special case + + if(!String.Equals(docOriginalEntity.Documentation, docChangeEntity.Documentation)) { tnEntity = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name, docOriginalEntity, docChangeEntity)); } + // add attributes foreach (DocAttribute docChangeAttr in docChangeEntity.Attributes) { DocObject docOriginalAttr = null; if (mapOriginal.TryGetValue(docChangeAttr.Uuid, out docOriginalAttr)) { - if (!String.Equals(docOriginalAttr.Documentation, docChangeAttr.Documentation)) + if (!String.Equals(docOriginalAttr.Name, docChangeAttr.Name) || + !String.Equals(docOriginalAttr.Documentation, docChangeAttr.Documentation)) + { + if(tnEntity == null) + { + tnEntity = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name, docOriginalEntity, docChangeEntity)); + } + this.AddNode(tnEntity, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name + "." + docOriginalAttr.Name, docOriginalAttr, docChangeAttr)); + } + } + else + { + if (tnEntity == null) + { + tnEntity = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name, docOriginalEntity, docChangeEntity)); + } + + // new attribute + this.AddNode(tnEntity, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name + "." + docChangeAttr.Name, null, docChangeAttr)); + } + } + + // remove attributes + foreach (DocAttribute docOriginalAttr in docOriginalEntity.Attributes) + { + bool bFound = false; + foreach(DocAttribute docChangeAttr in docChangeEntity.Attributes) + { + if (docOriginalAttr.Uuid.Equals(docChangeAttr.Uuid)) + { + bFound = true; + break; + } + } + + if(!bFound) + { + if (tnEntity == null) + { + tnEntity = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name, docOriginalEntity, docChangeEntity)); + } + + // delete attribute + this.AddNode(tnEntity, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name + "." + docOriginalAttr.Name, docOriginalAttr, null)); + } + } + + foreach (DocWhereRule docChangeWhere in docChangeEntity.WhereRules) + { + DocObject docOriginalWhere = null; + if (mapOriginal.TryGetValue(docChangeWhere.Uuid, out docOriginalWhere)) + { + DocWhereRule docOriginalWhereRule = (DocWhereRule)docOriginalWhere; + if (!String.Equals(docOriginalWhere.Name, docChangeWhere.Name) || + !String.Equals(docOriginalWhere.Documentation, docChangeWhere.Documentation) || + !String.Equals(docOriginalWhereRule.Expression, docChangeWhere.Expression)) { if (tnEntity == null) { tnEntity = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name, docOriginalEntity, docChangeEntity)); } - this.AddNode(tnEntity, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name + "." + docOriginalAttr.Name, docOriginalAttr, docChangeAttr)); + this.AddNode(tnEntity, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name + "." + docOriginalWhere.Name, docOriginalWhere, docChangeWhere)); } } + else + { + if (tnEntity == null) + { + tnEntity = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name, docOriginalEntity, docChangeEntity)); + } + + // new where rule + this.AddNode(tnEntity, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalEntity.Name + "." + docChangeWhere.Name, null, docChangeWhere)); + } } - foreach (DocWhereRule docChangeAttr in docChangeEntity.WhereRules) + foreach (DocUniqueRule docChangeAttr in docChangeEntity.UniqueRules) { DocObject docOriginalAttr = null; if (mapOriginal.TryGetValue(docChangeAttr.Uuid, out docOriginalAttr)) @@ -107,6 +215,29 @@ public FormMerge(Dictionary mapOriginal, DocProject docChange) } + foreach (DocFunction docChangeFunction in docChangeSchema.Functions) + { + DocObject docOriginalFunc = null; + if (mapOriginal.TryGetValue(docChangeFunction.Uuid, out docOriginalFunc)) + { + TreeNode tnType = null; + + DocFunction docOriginalFunction = (DocFunction)docOriginalFunc; + + if (!String.Equals(docOriginalFunction.Name, docChangeFunction.Name) || + !String.Equals(docOriginalFunction.Documentation, docChangeFunction.Documentation) || + !String.Equals(docOriginalFunction.Expression, docChangeFunction.Expression)) + { + tnType = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalFunction.Name, docOriginalFunction, docChangeFunction)); + } + } + else + { + // new attribute + this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docChangeFunction.Name, null, docChangeFunction)); + } + } + foreach (DocPropertySet docChangePset in docChangeSchema.PropertySets) { DocObject docOriginalPset = null; @@ -192,6 +323,91 @@ public FormMerge(Dictionary mapOriginal, DocProject docChange) } + foreach (DocPropertyEnumeration docChangePset in docChangeSchema.PropertyEnums) + { + DocObject docOriginalPset = null; + if (mapOriginal.TryGetValue(docChangePset.Uuid, out docOriginalPset)) + { + TreeNode tnPset = null; + if (!String.Equals(docOriginalPset.Documentation, docChangePset.Documentation)) + { + tnPset = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalPset.Name, docOriginalPset, docChangePset)); + } + + foreach (DocPropertyConstant docChangeProp in docChangePset.Constants) + { + DocObject docOriginalProp = ((DocPropertyEnumeration)docOriginalPset).GetConstant(docChangeProp.Name); + if (docOriginalProp != null) + { + TreeNode tnProperty = null; + if (!String.Equals(docOriginalProp.Documentation, docChangeProp.Documentation)) + { + if (tnPset == null) + { + tnPset = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalPset.Name, docOriginalPset, docChangePset)); + } + + tnProperty = this.AddNode(tnPset, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalPset.Name + "." + docOriginalProp.Name, docOriginalProp, docChangeProp)); + } + + // localization + foreach (DocLocalization docChangeLocal in docChangeProp.Localization) + { + DocLocalization docOriginalLocal = docOriginalProp.GetLocalization(docChangeLocal.Locale); + if (docOriginalLocal != null) + { + if (!String.Equals(docOriginalLocal.Documentation, docChangeLocal.Documentation)) + { + if (tnPset == null) + { + tnPset = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalPset.Name, docOriginalPset, docChangePset)); + } + + if (tnProperty == null) + { + tnProperty = this.AddNode(tnPset, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalPset.Name + "." + docOriginalProp.Name, docOriginalProp, docChangeProp)); + } + + this.AddNode(tnProperty, new ChangeInfo(docChangeLocal.Locale, docOriginalLocal, docChangeLocal)); + } + } + else + { + if (tnPset == null) + { + tnPset = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalPset.Name, docOriginalPset, docChangePset)); + } + + if (tnProperty == null) + { + tnProperty = this.AddNode(tnPset, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalPset.Name + "." + docOriginalProp.Name, docOriginalProp, docChangeProp)); + } + + // new localization + this.AddNode(tnProperty, new ChangeInfo(docChangeLocal.Locale, docOriginalLocal, docChangeLocal)); + } + } + } + else + { + if (tnPset == null) + { + tnPset = this.AddNode(tnSchema, new ChangeInfo(docOriginalSchema.Name + "." + docOriginalPset.Name, docOriginalPset, docChangePset)); + } + + // NEW: + this.AddNode(tnPset, new ChangeInfo(docChangeSchema.Name + "." + docChangePset.Name + "." + docChangeProp.Name, null, docChangeProp)); + } + } + } + else + { + // NEW: + this.AddNode(tnSchema, new ChangeInfo(docChangeSchema.Name + "." + docChangePset.Name, null, docChangePset)); + } + + } + foreach (DocQuantitySet docChangePset in docChangeSchema.QuantitySets) { DocObject docOriginalPset = null; @@ -264,10 +480,107 @@ private void SaveNode(TreeNode tn) DocObject docObj = (DocObject)parentinfo.Original; docObj.RegisterLocalization(localChange.Locale, localChange.Name, localChange.Documentation); } + else if(info.Change is DocAttribute) + { + DocAttribute localAttr = (DocAttribute)info.Change; + + ChangeInfo parentinfo = (ChangeInfo)tn.Parent.Tag; + DocEntity docEntity = (DocEntity)parentinfo.Original; + + DocAttribute docAttr = (DocAttribute)localAttr.Clone(); + docEntity.Attributes.Add(docAttr); + } + else if(info.Change is DocWhereRule) + { + DocWhereRule localAttr = (DocWhereRule)info.Change; + + ChangeInfo parentinfo = (ChangeInfo)tn.Parent.Tag; + DocEntity docEntity = (DocEntity)parentinfo.Original; + + DocWhereRule docAttr = (DocWhereRule)localAttr.Clone(); + docEntity.WhereRules.Add(docAttr); + } + else if(info.Change is DocFunction) + { + DocFunction localAttr = (DocFunction)info.Change; + + ChangeInfo parentinfo = (ChangeInfo)tn.Parent.Tag; + DocSchema docSchema = (DocSchema)parentinfo.Original; + + DocFunction docAttr = (DocFunction)localAttr.Clone(); + docSchema.Functions.Add(docAttr); + } + else if(info.Change is DocConstant) + { + this.ToString(); + } + else if(info.Change is DocProperty) + { + this.ToString(); + + DocProperty localProp = (DocProperty)info.Change; + + ChangeInfo parentinfo = (ChangeInfo)tn.Parent.Tag; + DocPropertySet docPset = (DocPropertySet)parentinfo.Original; + + DocProperty docProperty = (DocProperty)localProp.Clone(); + docPset.Properties.Add(docProperty); + } + else if(info.Change is DocPropertyConstant) + { + this.ToString(); + + DocPropertyConstant localProp = (DocPropertyConstant)info.Change; + + ChangeInfo parentinfo = (ChangeInfo)tn.Parent.Tag; + DocPropertyEnumeration docPset = (DocPropertyEnumeration)parentinfo.Original; + + DocPropertyEnumeration docEnumChange = (DocPropertyEnumeration)parentinfo.Change; + int index = docEnumChange.Constants.IndexOf(localProp); + + DocPropertyConstant docProperty = (DocPropertyConstant)localProp.Clone(); + docPset.Constants.Insert(index, docProperty); + } + else + { + this.ToString(); + } + } + else if(info.Change == null) + { + // removal of definition + if (info.Original is DocAttribute) + { + DocAttribute docAttr = (DocAttribute)info.Original; + ChangeInfo parentinfo = (ChangeInfo)tn.Parent.Tag; + DocEntity docEntity = (DocEntity)parentinfo.Original; + + docEntity.Attributes.Remove(docAttr); + docAttr.Delete(); + } + else + { + this.ToString(); + } } else { + // change of documentation + info.Original.Name = info.Change.Name; info.Original.Documentation = info.Change.Documentation; + + if (info.Original is DocWhereRule) + { + DocWhereRule whereOriginal = (DocWhereRule)info.Original; + DocWhereRule whereChange = (DocWhereRule)info.Change; + whereOriginal.Expression = whereChange.Expression; + } + else if(info.Original is DocFunction) + { + DocFunction whereOriginal = (DocFunction)info.Original; + DocFunction whereChange = (DocFunction)info.Change; + whereOriginal.Expression = whereChange.Expression; + } } } @@ -292,18 +605,25 @@ protected override void OnClosed(EventArgs e) private void radioButtonOriginal_Click(object sender, EventArgs e) { - this.treeView.SelectedNode.Checked = true; + this.treeView.SelectedNode.Checked = false; } private void radioButtonChange_Click(object sender, EventArgs e) { - this.treeView.SelectedNode.Checked = false; + this.treeView.SelectedNode.Checked = true; } private void UpdateNode(TreeNode tn) { ChangeInfo changeinfo = (ChangeInfo)tn.Tag; - tn.Text = changeinfo.Change.Name; + if (changeinfo.Change != null) + { + tn.Text = changeinfo.Change.Name; + } + else if(changeinfo.Original != null) + { + tn.Text = changeinfo.Original.Name; + } // back color indicates change type if (changeinfo.Original == null) @@ -351,17 +671,94 @@ private TreeNode AddNode(TreeNode tnParent, ChangeInfo changeinfo) private void treeView_AfterSelect(object sender, TreeViewEventArgs e) { + this.lvSource.Items.Clear(); + this.lvDestination.Items.Clear(); + ChangeInfo info = (ChangeInfo)this.treeView.SelectedNode.Tag; - if (info.Original != null) - { - this.textBoxOriginal.Text = info.Original.Documentation; - } - else + DiffList_TextString source = new DiffList_TextString(info.Original != null ? info.Original.Documentation : String.Empty); + DiffList_TextString destination = new DiffList_TextString(info.Change != null ? info.Change.Documentation : String.Empty); + DiffEngine de = new DiffEngine(); + de.ProcessDiff(source, destination, DiffEngineLevel.SlowPerfect); + ArrayList DiffLines = de.DiffReport(); + + ListViewItem lviS; + ListViewItem lviD; + int cnt = 1; + int i; + + foreach (DiffResultSpan drs in DiffLines) { - this.textBoxOriginal.Text = String.Empty; + switch (drs.Status) + { + case DiffResultSpanStatus.DeleteSource: + for (i = 0; i < drs.Length; i++) + { + lviS = new ListViewItem(cnt.ToString("00000")); + lviD = new ListViewItem(cnt.ToString("00000")); + lviS.BackColor = Color.Red; + lviS.SubItems.Add(((TextLine)source.GetByIndex(drs.SourceIndex + i)).Line); + lviD.BackColor = Color.LightGray; + lviD.SubItems.Add(""); + + lvSource.Items.Add(lviS); + lvDestination.Items.Add(lviD); + cnt++; + } + + break; + case DiffResultSpanStatus.NoChange: + for (i = 0; i < drs.Length; i++) + { + lviS = new ListViewItem(cnt.ToString("00000")); + lviD = new ListViewItem(cnt.ToString("00000")); + lviS.BackColor = Color.White; + lviS.SubItems.Add(((TextLine)source.GetByIndex(drs.SourceIndex + i)).Line); + lviD.BackColor = Color.White; + lviD.SubItems.Add(((TextLine)destination.GetByIndex(drs.DestIndex + i)).Line); + + lvSource.Items.Add(lviS); + lvDestination.Items.Add(lviD); + cnt++; + } + + break; + case DiffResultSpanStatus.AddDestination: + for (i = 0; i < drs.Length; i++) + { + lviS = new ListViewItem(cnt.ToString("00000")); + lviD = new ListViewItem(cnt.ToString("00000")); + lviS.BackColor = Color.LightGray; + lviS.SubItems.Add(""); + lviD.BackColor = Color.LightGreen; + lviD.SubItems.Add(((TextLine)destination.GetByIndex(drs.DestIndex + i)).Line); + + lvSource.Items.Add(lviS); + lvDestination.Items.Add(lviD); + cnt++; + } + + break; + case DiffResultSpanStatus.Replace: + for (i = 0; i < drs.Length; i++) + { + lviS = new ListViewItem(cnt.ToString("00000")); + lviD = new ListViewItem(cnt.ToString("00000")); + lviS.BackColor = Color.Red; + lviS.SubItems.Add(((TextLine)source.GetByIndex(drs.SourceIndex + i)).Line); + lviD.BackColor = Color.LightGreen; + lviD.SubItems.Add(((TextLine)destination.GetByIndex(drs.DestIndex + i)).Line); + + lvSource.Items.Add(lviS); + lvDestination.Items.Add(lviD); + cnt++; + } + + break; + } + } - this.textBoxChange.Text = info.Change.Documentation; + this.radioButtonOriginal.Checked = !this.treeView.SelectedNode.Checked; this.radioButtonChange.Checked = this.treeView.SelectedNode.Checked; @@ -394,6 +791,42 @@ private void CheckNode(TreeNode tn, bool state) CheckNode(tnSub, state); } } + + private void lvSource_SelectedIndexChanged(object sender, EventArgs e) + { + if (lvSource.SelectedItems.Count > 0) + { + ListViewItem lvi = lvDestination.Items[lvSource.SelectedItems[0].Index]; + lvi.Selected = true; + lvi.EnsureVisible(); + } + } + + private void lvDestination_SelectedIndexChanged(object sender, EventArgs e) + { + if (lvDestination.SelectedItems.Count > 0) + { + ListViewItem lvi = lvSource.Items[lvDestination.SelectedItems[0].Index]; + lvi.Selected = true; + lvi.EnsureVisible(); + } + } + + private void lvSource_Resize(object sender, EventArgs e) + { + if (lvSource.Width > 100) + { + lvSource.Columns[1].Width = -2; + } + } + + private void lvDestination_Resize(object sender, EventArgs e) + { + if (lvDestination.Width > 100) + { + lvDestination.Columns[1].Width = -2; + } + } } public class ChangeInfo diff --git a/FormMerge.ja.resx b/FormMerge.ja.resx index 8c05fd9d..631df89f 100644 --- a/FormMerge.ja.resx +++ b/FormMerge.ja.resx @@ -118,31 +118,66 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 96, 13 + + 360, 3 - - 変更されたアイテム + + 840, 526 - - 54, 17 + + 921, 526 - - キープ + + 715, 495 - - 49, 17 + + 263, 492 - - 変更 + + + Fill - - OK + + 360, 26 - - キャンセル + + 352, 466 - - 併合用 + + Line + + + + 50 + + + Text (Destination) + + + 198 + + + Fill + + + 3, 26 + + + 351, 466 + + + Line + + + 50 + + + Text (Source) + + + 147 + + + 1008, 561 \ No newline at end of file diff --git a/FormMerge.resx b/FormMerge.resx index aee8f52f..72bb71e3 100644 --- a/FormMerge.resx +++ b/FormMerge.resx @@ -117,280 +117,340 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Both + + + True - - 3 + + + 9, 7 - - tableLayoutPanel1 + + 165, 13 - - tableLayoutPanel1 + + 0 - - - 248, 26 + + Schema definitions with changes: - - 697, 529 + + label3 - - 240, 466 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3, 3 + + $this - - OK + + 5 - - 75, 23 + + True - - tableLayoutPanel1 + + 3, 3 - - 239, 466 + + 92, 17 - - $this + + 2 - - $this + + Keep Existing: - - 81, 13 + + radioButtonOriginal - - 281, 28 + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - $this + + tableLayoutPanel1 - - label3 + + 2 - - Top, Bottom, Left, Right + + True - - textBoxChange + + 248, 3 - - 491, 495 + + 102, 17 - - Bottom, Right + + 3 Accept Change: - - 12, 12 + + radioButtonChange - - - 9 + + System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Both + + tableLayoutPanel1 - - 2 + + 1 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Bottom, Right - - True + + 616, 529 - - Keep Existing: + + 75, 23 - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 6 - - True + + OK - - tableLayoutPanel1 + + buttonOK - - 6, 13 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 616, 529 + + $this - - True + + 4 + + + Bottom, Right + + + 697, 529 - - 3, 26 + + 75, 23 + + + 7 Cancel - - 2 - buttonCancel - - 92, 17 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 6 + + $this - + 3 - - 1 + + Top, Bottom, Left, Right - + 2 - - textBoxOriginal + + Line - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Changes - - Changed Items: + + 176 - - 4 + + Fill - - 102, 17 + + 248, 46 - - $this + + 240, 449 - + + 11 + + + lvDestination + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tableLayoutPanel1 + + 0 - - Fill + + Line - - $this + + Current - - Top, Bottom, Left + + 175 - - True + + Fill - - tableLayoutPanel1 + + 3, 46 - - 12, 28 + + 239, 449 - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 10 - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + lvSource - - buttonOK + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - radioButtonChange + + tableLayoutPanel1 - - FormMerge + + 3 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 281, 28 - - 75, 23 + + 3 - - 7 + + 491, 498 - - radioButtonOriginal + + 8 - - <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="textBoxOriginal" Row="1" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="textBoxChange" Row="1" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="radioButtonChange" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="radioButtonOriginal" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,50,Percent,50" /><Rows Styles="AutoSize,0,Percent,100" /></TableLayoutSettings> + + tableLayoutPanel1 - - treeView + + System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.RadioButton, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - + 2 + + <?xml version="1.0" encoding="utf-16"?><TableLayoutSettings><Controls><Control Name="lvDestination" Row="2" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="radioButtonChange" Row="0" RowSpan="1" Column="1" ColumnSpan="1" /><Control Name="radioButtonOriginal" Row="0" RowSpan="1" Column="0" ColumnSpan="1" /><Control Name="lvSource" Row="2" RowSpan="1" Column="0" ColumnSpan="1" /></Controls><Columns Styles="Percent,50,Percent,50" /><Rows Styles="AutoSize,0,Absolute,20,Percent,100" /></TableLayoutSettings> + + + Top, Bottom, Left + + + 12, 28 + 263, 495 - - Merge + + 9 - - 5 + + treeView + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - + + $this + + + 1 + + + Bottom, Left + + True - - Fill + + NoControl - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 12, 534 + + + 532, 13 + + + 10 + + + Note: Merging only impacts documentation and changes within types or entities; it does not impact model views. + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this - + 0 + + True + + + 6, 13 + 784, 564 - - 0 + + Merge - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + columnHeader3 - - 248, 3 + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 1 + + columnHeader4 - - 4 + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 8 + + columnHeader1 - - Bottom, Right + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.TableLayoutPanel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + columnHeader2 - - 3 + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 2 + + FormMerge + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - - - ja - \ No newline at end of file diff --git a/FormParameters.Designer.cs b/FormParameters.Designer.cs index c8c46dd5..ec9f4523 100644 --- a/FormParameters.Designer.cs +++ b/FormParameters.Designer.cs @@ -34,11 +34,12 @@ private void InitializeComponent() // // ctlParameters // - resources.ApplyResources(this.ctlParameters, "ctlParameters"); this.ctlParameters.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.ctlParameters.ConceptItem = null; this.ctlParameters.ConceptLeaf = null; this.ctlParameters.ConceptRoot = null; this.ctlParameters.CurrentInstance = null; + resources.ApplyResources(this.ctlParameters, "ctlParameters"); this.ctlParameters.Name = "ctlParameters"; this.ctlParameters.Project = null; // diff --git a/FormParameters.cs b/FormParameters.cs index ae07d0b6..dae0d35d 100644 --- a/FormParameters.cs +++ b/FormParameters.cs @@ -42,6 +42,18 @@ public DocConceptRoot ConceptRoot } } + public DocObject ConceptItem + { + get + { + return this.ctlParameters.ConceptItem; + } + set + { + this.ctlParameters.ConceptItem = value; + } + } + public DocTemplateUsage ConceptLeaf { get diff --git a/FormParameters.resx b/FormParameters.resx index 6d7b2c57..36125eae 100644 --- a/FormParameters.resx +++ b/FormParameters.resx @@ -117,52 +117,49 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Fill - - 6, 13 - - - - 12 + + 0, 0 624, 441 - - - Fill + + + 12 - - 624, 441 + + ctlParameters - IfcDoc.CtlParameters, IfcDoc, Version=8.4.0.0, Culture=neutral, PublicKeyToken=null + IfcDoc.CtlParameters, IfcDoc, Version=9.4.0.0, Culture=neutral, PublicKeyToken=null + + + $this 0 - - FormParameters - - - 0, 0 + + True + + + 6, 13 - - $this + + 624, 441 Parameters - - ctlParameters + + FormParameters + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - - - ja - \ No newline at end of file diff --git a/FormPublish.ja.resx b/FormPublish.ja.resx index 71c9abdc..c6bc0945 100644 --- a/FormPublish.ja.resx +++ b/FormPublish.ja.resx @@ -117,25 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - OK - - - キャンセル - - - 65, 13 - - - 変更の概要 - - - 179, 13 - - - 次のURLでリポジトリにファイルを公開 - AAABAAkAMDAQAAAAAABoBgAAlgAAACAgEAAAAAAA6AIAAP4GAAAQEBAAAAAAACgBAADmCQAAMDAAAAEA @@ -561,7 +543,4 @@ Qf8AA0H/gAdE/+APQv8= - - パブリッシュ - \ No newline at end of file diff --git a/FormPublish.resx b/FormPublish.resx index b11d658b..9dc5d133 100644 --- a/FormPublish.resx +++ b/FormPublish.resx @@ -124,9 +124,6 @@ Publish file to a repository at the following URL: - - 7 - 2 @@ -143,6 +140,9 @@ System.ComponentModel.BackgroundWorker, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + MiddleRight + MiddleRight @@ -155,27 +155,22 @@ - - 15, 25 - - - 219, 229 - 16, 200 - - OK - 75, 23 label1 + + + 0 + 360, 122 @@ -185,15 +180,17 @@ 359, 23 - 0 7 - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Summary of changes: + + + 16, 238 6, 13 @@ -216,6 +213,9 @@ $this + + MiddleRight + 4 @@ -225,6 +225,9 @@ 0 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + 1 @@ -234,8 +237,8 @@ 228, 13 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 75, 23 0 @@ -267,12 +270,12 @@ Cancel - - 109, 13 - 0 + + 0 + buttonCancel @@ -291,9 +294,6 @@ $this - - 0 - @@ -306,9 +306,6 @@ 0 - - 0 - System.Windows.Forms.ErrorProvider, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -333,6 +330,9 @@ + + $this + True @@ -767,26 +767,20 @@ buttonOK - - 2 - MiddleRight - - FormPublish - - - 0 + + 219, 229 12, 9 - - 75, 23 + + OK - - MiddleRight + + 15, 25 6 @@ -800,14 +794,20 @@ Top, Bottom, Left, Right - - MiddleRight + + 15, 72 + + + 0 True - - $this + + 2 + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 @@ -815,8 +815,8 @@ 6 - - 0 + + 109, 13 Publish @@ -830,8 +830,8 @@ $this - - 16, 238 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 MiddleRight @@ -839,36 +839,33 @@ 384, 264 - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + FormPublish - - 15, 72 + + 7 - - Summary of changes: + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 errorProvider + + 0 + True - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Bottom, Right - - 17, 17 - - - ja - True + + 17, 17 + 213, 17 diff --git a/FormReference.Designer.cs b/FormReference.Designer.cs index 5912f28f..2c3ba061 100644 --- a/FormReference.Designer.cs +++ b/FormReference.Designer.cs @@ -39,6 +39,7 @@ private void InitializeComponent() this.buttonOK = new System.Windows.Forms.Button(); this.label1 = new System.Windows.Forms.Label(); this.textBoxReference = new System.Windows.Forms.TextBox(); + this.buttonProperty = new System.Windows.Forms.Button(); this.SuspendLayout(); // // listViewReference @@ -105,12 +106,20 @@ private void InitializeComponent() this.textBoxReference.Name = "textBoxReference"; this.textBoxReference.ReadOnly = true; // + // buttonProperty + // + resources.ApplyResources(this.buttonProperty, "buttonProperty"); + this.buttonProperty.Name = "buttonProperty"; + this.buttonProperty.UseVisualStyleBackColor = true; + this.buttonProperty.Click += new System.EventHandler(this.buttonProperty_Click); + // // FormReference // this.AcceptButton = this.buttonOK; resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.buttonCancel; + this.Controls.Add(this.buttonProperty); this.Controls.Add(this.textBoxReference); this.Controls.Add(this.label1); this.Controls.Add(this.buttonCancel); @@ -140,5 +149,6 @@ private void InitializeComponent() private System.Windows.Forms.Button buttonOK; private System.Windows.Forms.Label label1; private System.Windows.Forms.TextBox textBoxReference; + private System.Windows.Forms.Button buttonProperty; } } \ No newline at end of file diff --git a/FormReference.cs b/FormReference.cs index c678adae..74b322ec 100644 --- a/FormReference.cs +++ b/FormReference.cs @@ -57,6 +57,10 @@ private void LoadValuePath(CvtValuePath valuepath) { this.textBoxReference.Text = valuepath.ToString(); } + else + { + this.textBoxReference.Text = String.Empty; + } while (valuepath != null) { @@ -152,8 +156,10 @@ private void buttonInsert_Click(object sender, EventArgs e) } // drill in - docBase = this.m_map[formAttribute.SelectedAttribute.DefinedType] as DocDefinition; - + if (this.m_map.ContainsKey(formAttribute.SelectedAttribute.DefinedType)) + { + docBase = this.m_map[formAttribute.SelectedAttribute.DefinedType] as DocDefinition; + } } else { @@ -200,5 +206,39 @@ private void buttonRemove_Click(object sender, EventArgs e) private void listViewReference_SelectedIndexChanged(object sender, EventArgs e) { } + + private void buttonProperty_Click(object sender, EventArgs e) + { + using(FormSelectProperty form = new FormSelectProperty(this.m_base as DocEntity, this.m_project, false)) + { + if(form.ShowDialog(this) == System.Windows.Forms.DialogResult.OK) + { + string valueprop = "NominalValue"; + switch(form.SelectedProperty.PropertyType) + { + case DocPropertyTemplateTypeEnum.P_BOUNDEDVALUE: + valueprop = "SetPointValue"; + break; + + case DocPropertyTemplateTypeEnum.P_ENUMERATEDVALUE: + valueprop = "EnumerationValues"; + break; + + case DocPropertyTemplateTypeEnum.P_LISTVALUE: + valueprop = "ListValues"; + break; + + // other property types are not supported + } + + string value = @"\" + this.m_base.Name + @".IsDefinedBy['" + form.SelectedPropertySet + + @"']\IfcRelDefinesByProperties.RelatingPropertyDefinition\IfcPropertySet.HasProperties['" + form.SelectedProperty + + @"']\" + form.SelectedProperty.GetEntityName() + @"." + valueprop + @"\" + form.SelectedProperty.PrimaryDataType; + + CvtValuePath valuepath = CvtValuePath.Parse(value, this.m_map); + LoadValuePath(valuepath); + } + } + } } } diff --git a/FormReference.ja.resx b/FormReference.ja.resx index 61def327..06bc30e0 100644 --- a/FormReference.ja.resx +++ b/FormReference.ja.resx @@ -117,33 +117,32 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 実体 - - - 属性 + + Attribute... - - 項目 + + + 175, 326 - - セット + + + 3 - - クリア + + 5 - - キャンセル + + 4 - - OK + + + Bottom, Left - - - 76, 13 + + NoControl - - 値参照を編集 + + Property... @@ -318,7 +317,4 @@ AAAAAAAAAAAAAAAAAAAAAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AEAAPADAADwBwAA - - 参照 - \ No newline at end of file diff --git a/FormReference.resx b/FormReference.resx index d1fb04f2..4c51238c 100644 --- a/FormReference.resx +++ b/FormReference.resx @@ -117,158 +117,245 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Edit the value reference: + + + Top, Bottom, Left, Right - - columnHeaderItem + + Entity - - 0 + + 256 - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Attribute - - $this + + 256 + + + Item + + + 256 - - 737, 326 + + 13, 60 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 799, 251 - - Attribute + + 0 - - 75, 23 + + listViewReference + + + System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 7 + + + Bottom, Left 13, 326 - - label1 + + 75, 23 - - 256 + + 1 - - 6 + + Attribute... - - 4 + + buttonInsert System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True + + $this - - 6, 13 + + 6 - - buttonInsert + + Bottom, Left - - - Bottom, Right + + 175, 326 - - $this + + 75, 23 - - 256 + + 2 - - 1 + + Clear - - 13, 29 + + buttonRemove - - 9 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - 123, 13 + + 5 - + + Bottom, Right + + + 737, 326 + + + 75, 23 + + 6 - - Entity + + Cancel buttonCancel - - columnHeaderEntity - - - columnHeaderAttribute - - - 13, 60 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 10 + + $this - - Top, Left, Right + + 3 - - System.Windows.Forms.ListView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Bottom, Right - - $this + + 656, 326 - - Cancel + + 75, 23 5 - - 95, 326 - - - 75, 23 + + OK - - Top, Bottom, Left, Right + + buttonOK System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this + + + 4 + + + True + + + 12, 9 + + + 123, 13 + + + 9 + + + Edit the value reference: + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Top, Left, Right + + + 13, 29 + + + True + + + 799, 25 + + + 10 + textBoxReference - - FormReference + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this - 0 + 1 - - $this + + 94, 326 - - Clear + + 75, 23 - + + 2 + + + Property... + + + buttonProperty + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - 799, 251 + + 0 - + True + + + 6, 13 + + + 824, 361 @@ -443,97 +530,31 @@ AAAAAAAAAAAAAAAAAAAAAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AEAAPADAADwBwAA - - 1 - - - 256 - - - 75, 23 - - - 2 - - - buttonRemove - - - 656, 326 - - - 12, 9 - - - OK - - - 75, 23 + + Reference - - Set... + + columnHeaderEntity System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - listViewReference - - - $this - - - Bottom, Left - - - 2 - - - buttonOK - - - Reference - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + columnHeaderAttribute - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 799, 25 + + columnHeaderItem - - 824, 361 + + System.Windows.Forms.ColumnHeader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 5 + + FormReference System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 3 - - - Item - - - $this - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bottom, Right - - - Bottom, Left - - - True - - - ja - \ No newline at end of file diff --git a/FormRule.Designer.cs b/FormRule.Designer.cs index f751bffa..cd30ea5f 100644 --- a/FormRule.Designer.cs +++ b/FormRule.Designer.cs @@ -31,7 +31,6 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormRule)); this.label3 = new System.Windows.Forms.Label(); this.textBoxIdentifier = new System.Windows.Forms.TextBox(); - this.label2 = new System.Windows.Forms.Label(); this.comboBoxCardinality = new System.Windows.Forms.ComboBox(); this.buttonCancel = new System.Windows.Forms.Button(); this.buttonOK = new System.Windows.Forms.Button(); @@ -39,6 +38,7 @@ private void InitializeComponent() this.label5 = new System.Windows.Forms.Label(); this.textBoxBehavior = new System.Windows.Forms.TextBox(); this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); this.SuspendLayout(); // // label3 @@ -52,11 +52,6 @@ private void InitializeComponent() this.textBoxIdentifier.Name = "textBoxIdentifier"; this.textBoxIdentifier.TextChanged += new System.EventHandler(this.textBoxIdentifier_TextChanged); // - // label2 - // - resources.ApplyResources(this.label2, "label2"); - this.label2.Name = "label2"; - // // comboBoxCardinality // resources.ApplyResources(this.comboBoxCardinality, "comboBoxCardinality"); @@ -113,6 +108,11 @@ private void InitializeComponent() resources.ApplyResources(this.label1, "label1"); this.label1.Name = "label1"; // + // label2 + // + resources.ApplyResources(this.label2, "label2"); + this.label2.Name = "label2"; + // // FormRule // this.AcceptButton = this.buttonOK; @@ -142,7 +142,6 @@ private void InitializeComponent() private System.Windows.Forms.Label label3; private System.Windows.Forms.TextBox textBoxIdentifier; - private System.Windows.Forms.Label label2; private System.Windows.Forms.ComboBox comboBoxCardinality; private System.Windows.Forms.Button buttonCancel; private System.Windows.Forms.Button buttonOK; @@ -150,5 +149,6 @@ private void InitializeComponent() private System.Windows.Forms.Label label5; private System.Windows.Forms.TextBox textBoxBehavior; private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; } } \ No newline at end of file diff --git a/FormRule.ja.resx b/FormRule.ja.resx index d4f4f4e0..201eb2f7 100644 --- a/FormRule.ja.resx +++ b/FormRule.ja.resx @@ -117,61 +117,11 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 85, 13 - - - テンプレート利用 - - - 31, 13 - - - 濃度 - - - (スキーマとして) - - - ゼロ - - - ゼロ対一 - - - 一つ - - - 一対多数の - - - キャンセル - - - OK - - - なし - - - 条件 - - - 制約集 - - - 73, 13 - - - パラメーター名 - - - 31, 13 - - - 動作 + + + NoControl + AAABAAIAICAAAAEAIACoEAAAJgAAABAQAAABACAAaAQAAM4QAAAoAAAAIAAAAEAAAAABACAAAAAAAAAA @@ -267,7 +217,4 @@ RP8AAUH/4AE//+ABPP/gATr/4AFS/+ADTv/gB0v/ - - ルール - \ No newline at end of file diff --git a/FormRule.resx b/FormRule.resx index 52937101..f9361021 100644 --- a/FormRule.resx +++ b/FormRule.resx @@ -117,122 +117,158 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Top, Left, Right + + + True - - Behavior: + + + 10, 8 - - Constraint + + 88, 13 - - - 400, 300 + + 0 - - 3 + + Template Usage: - - $this + + label3 - - 298, 229 + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 + + $this - - textBoxIdentifier + + 8 - - 75, 23 + + + Top, Left, Right - - label1 + + 13, 71 - - 10, 54 + + 359, 20 3 - + + textBoxIdentifier + + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 9 + + Top, Left, Right + (As Schema) - - True + + Zero - - True + + Zero-To-One - - 88, 13 + + One - - 6, 13 + + One-to-Many - - label3 + + 13, 117 - - textBoxBehavior + + 359, 21 - - True + + 5 - - 13, 71 + + False - + + comboBoxCardinality + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this + + 7 + Bottom, Right - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 298, 126 - + + 75, 23 + + + 9 + + + Cancel + + + buttonCancel + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - - 10, 8 + + 4 - - 0 + + Bottom, Right - - 7 + + 214, 126 - - 7 + + 75, 23 - - 6 + + 8 - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + OK - - 4 + + buttonOK - - 52, 13 + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Zero + + $this - - comboBoxUsage + + 5 - - Zero-To-One + + Top, Left, Right None @@ -240,95 +276,155 @@ Condition - - buttonCancel + + Constraint - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + 13, 25 - - label5 + + 359, 21 + + + 1 + + + comboBoxUsage System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - 6 + + $this - - 58, 13 + + 3 - - 13, 25 + + True + + + 10, 54 + + + 89, 13 + + + 2 + + + Parameter Name: + + + label5 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this - - OK - 2 - - 8 + + Top, Bottom, Left, Right - - 75, 23 + + 13, 164 - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + True - - 2 + + 359, 0 - - Cancel + + 7 - - Template Usage: + + False - - Parameter Name: + + textBoxBehavior - + + System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 1 - - Top, Left, Right + + True - - $this + + 10, 147 - - $this + + 52, 13 - - $this + + 6 - - 9 + + Behavior: - + + False + + + label1 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + $this - + + 0 + + True - - One-to-Many + + 10, 100 - - One + + 58, 13 - - Top, Left, Right + + 4 - + + Cardinality: + + + False + + + label2 + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 6 + + True + + + 6, 13 - - 13, 117 + + 384, 161 @@ -425,103 +521,16 @@ RP8AAUH/4AE//+ABPP/gATr/4AFS/+ADTv/gB0v/ - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 359, 20 - - - FormRule - - - 214, 229 - - - 10, 147 + + 400, 200 Rule - - Cardinality: - - - 0 - - - 10, 100 - - - comboBoxCardinality - - - Top, Bottom, Left, Right - - - 13, 164 - - - $this - - - 89, 13 - - - 359, 59 - - - 4 - - - buttonOK - - - label2 - - - 359, 21 - - - $this - - - 1 - - - System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 384, 264 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 5 - - - 359, 21 - - - 8 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bottom, Right - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + FormRule - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - - - ja - \ No newline at end of file diff --git a/FormSelectEntity.Designer.cs b/FormSelectEntity.Designer.cs index 837ebce2..7c929de7 100644 --- a/FormSelectEntity.Designer.cs +++ b/FormSelectEntity.Designer.cs @@ -31,9 +31,16 @@ private void InitializeComponent() System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSelectEntity)); this.buttonCancel = new System.Windows.Forms.Button(); this.buttonOK = new System.Windows.Forms.Button(); - this.treeView = new System.Windows.Forms.TreeView(); + this.treeViewInheritance = new System.Windows.Forms.TreeView(); this.comboBoxPredefined = new System.Windows.Forms.ComboBox(); this.labelPredefined = new System.Windows.Forms.Label(); + this.tabControl1 = new System.Windows.Forms.TabControl(); + this.tabPage1 = new System.Windows.Forms.TabPage(); + this.tabPage2 = new System.Windows.Forms.TabPage(); + this.treeViewAlphabetical = new System.Windows.Forms.TreeView(); + this.tabControl1.SuspendLayout(); + this.tabPage1.SuspendLayout(); + this.tabPage2.SuspendLayout(); this.SuspendLayout(); // // buttonCancel @@ -50,12 +57,12 @@ private void InitializeComponent() this.buttonOK.Name = "buttonOK"; this.buttonOK.UseVisualStyleBackColor = true; // - // treeView + // treeViewInheritance // - resources.ApplyResources(this.treeView, "treeView"); - this.treeView.HideSelection = false; - this.treeView.Name = "treeView"; - this.treeView.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView_AfterSelect); + resources.ApplyResources(this.treeViewInheritance, "treeViewInheritance"); + this.treeViewInheritance.HideSelection = false; + this.treeViewInheritance.Name = "treeViewInheritance"; + this.treeViewInheritance.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewInheritance_AfterSelect); // // comboBoxPredefined // @@ -68,21 +75,53 @@ private void InitializeComponent() resources.ApplyResources(this.labelPredefined, "labelPredefined"); this.labelPredefined.Name = "labelPredefined"; // + // tabControl1 + // + resources.ApplyResources(this.tabControl1, "tabControl1"); + this.tabControl1.Controls.Add(this.tabPage1); + this.tabControl1.Controls.Add(this.tabPage2); + this.tabControl1.Name = "tabControl1"; + this.tabControl1.SelectedIndex = 0; + // + // tabPage1 + // + this.tabPage1.Controls.Add(this.treeViewInheritance); + resources.ApplyResources(this.tabPage1, "tabPage1"); + this.tabPage1.Name = "tabPage1"; + this.tabPage1.UseVisualStyleBackColor = true; + // + // tabPage2 + // + this.tabPage2.Controls.Add(this.treeViewAlphabetical); + resources.ApplyResources(this.tabPage2, "tabPage2"); + this.tabPage2.Name = "tabPage2"; + this.tabPage2.UseVisualStyleBackColor = true; + // + // treeViewAlphabetical + // + resources.ApplyResources(this.treeViewAlphabetical, "treeViewAlphabetical"); + this.treeViewAlphabetical.HideSelection = false; + this.treeViewAlphabetical.Name = "treeViewAlphabetical"; + this.treeViewAlphabetical.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewAlphabetical_AfterSelect); + // // FormSelectEntity // this.AcceptButton = this.buttonOK; resources.ApplyResources(this, "$this"); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.CancelButton = this.buttonCancel; + this.Controls.Add(this.tabControl1); this.Controls.Add(this.labelPredefined); this.Controls.Add(this.comboBoxPredefined); - this.Controls.Add(this.treeView); this.Controls.Add(this.buttonCancel); this.Controls.Add(this.buttonOK); this.MaximizeBox = false; this.MinimizeBox = false; this.Name = "FormSelectEntity"; this.ShowInTaskbar = false; + this.tabControl1.ResumeLayout(false); + this.tabPage1.ResumeLayout(false); + this.tabPage2.ResumeLayout(false); this.ResumeLayout(false); this.PerformLayout(); @@ -92,8 +131,12 @@ private void InitializeComponent() private System.Windows.Forms.Button buttonCancel; private System.Windows.Forms.Button buttonOK; - private System.Windows.Forms.TreeView treeView; + private System.Windows.Forms.TreeView treeViewInheritance; private System.Windows.Forms.ComboBox comboBoxPredefined; private System.Windows.Forms.Label labelPredefined; + private System.Windows.Forms.TabControl tabControl1; + private System.Windows.Forms.TabPage tabPage1; + private System.Windows.Forms.TabPage tabPage2; + private System.Windows.Forms.TreeView treeViewAlphabetical; } } \ No newline at end of file diff --git a/FormSelectEntity.cs b/FormSelectEntity.cs index be65e16c..f6b8ae48 100644 --- a/FormSelectEntity.cs +++ b/FormSelectEntity.cs @@ -24,6 +24,9 @@ public partial class FormSelectEntity : Form DocProject m_project; SelectDefinitionOptions m_options; + Dictionary m_mapAlpha; + Dictionary m_mapInherit; + public FormSelectEntity() { InitializeComponent(); @@ -48,14 +51,19 @@ public FormSelectEntity( this.m_project = project; this.m_options = options; + this.m_mapAlpha = new Dictionary(); + this.m_mapInherit = new Dictionary(); + // load subtypes, sort alphabetically if (this.m_basetype is DocEntity) { this.LoadEntity(null, (DocEntity)this.m_basetype); + this.tabControl1.TabPages.RemoveAt(1); } else if (this.m_basetype is DocSelect) { this.LoadSelect(null, (DocSelect)this.m_basetype); + this.tabControl1.TabPages.RemoveAt(1); } else if (this.m_basetype != null) { @@ -63,12 +71,15 @@ public FormSelectEntity( TreeNode tn = new TreeNode(); tn.Tag = basetype; tn.Text = basetype.Name; - this.treeView.Nodes.Add(tn); + this.treeViewInheritance.Nodes.Add(tn); + + this.tabControl1.TabPages.RemoveAt(1); } else { // all entities SortedList sort = new SortedList(); + SortedList sortAll = new SortedList(); foreach (DocSection docSection in this.m_project.Sections) { foreach (DocSchema docSchema in docSection.Schemas) @@ -82,6 +93,11 @@ public FormSelectEntity( sort.Add(docEntity.Name, docEntity); } } + + if (!sortAll.ContainsKey(docEntity.Name)) + { + sortAll.Add(docEntity.Name, docEntity); + } } if ((options & SelectDefinitionOptions.Type) != 0) @@ -90,6 +106,11 @@ public FormSelectEntity( foreach (DocType docType in docSchema.Types) { sort.Add(docType.Name, docType); + + if (!sortAll.ContainsKey(docType.Name)) + { + sortAll.Add(docType.Name, docType); + } } } } @@ -106,15 +127,24 @@ public FormSelectEntity( this.LoadType(null, (DocType)docDef); } } + + foreach(DocDefinition docDef in sortAll.Values) + { + TreeNode tnAlpha = new TreeNode(); + tnAlpha.Tag = docDef; + tnAlpha.Text = docDef.Name; + this.m_mapAlpha.Add(docDef, tnAlpha); + this.treeViewAlphabetical.Nodes.Add(tnAlpha); + } } - if (this.treeView.SelectedNode == null && this.treeView.Nodes.Count > 0) + if (this.treeViewInheritance.SelectedNode == null && this.treeViewInheritance.Nodes.Count > 0) { - this.treeView.SelectedNode = this.treeView.Nodes[0]; + this.treeViewInheritance.SelectedNode = this.treeViewInheritance.Nodes[0]; } - this.treeView.ExpandAll(); - this.treeView.Focus(); + this.treeViewInheritance.ExpandAll(); + this.treeViewInheritance.Focus(); } private void LoadSelect(TreeNode tnParent, DocSelect select) @@ -133,7 +163,7 @@ private void LoadSelect(TreeNode tnParent, DocSelect select) } else { - this.treeView.Nodes.Add(tn); + this.treeViewInheritance.Nodes.Add(tn); } // add subtypes @@ -188,6 +218,7 @@ private void LoadType(TreeNode tnParent, DocType type) TreeNode tn = new TreeNode(); tn.Tag = type; tn.Text = type.Name; + this.m_mapInherit.Add(type, tn); if (tnParent != null) { @@ -195,12 +226,12 @@ private void LoadType(TreeNode tnParent, DocType type) } else { - this.treeView.Nodes.Add(tn); + this.treeViewInheritance.Nodes.Add(tn); } if (this.m_selection == type) { - this.treeView.SelectedNode = tn; + this.treeViewInheritance.SelectedNode = tn; } // special case if typed as aggregation to an entity, e.g. IfcPropertySetDefinitionSet @@ -232,10 +263,15 @@ private void LoadEntity(TreeNode tnParent, DocEntity entity) if (entity == null) return; // no such entity + if (this.m_mapInherit.ContainsKey(entity)) + return; + // add entity TreeNode tn = new TreeNode(); tn.Tag = entity; tn.Text = entity.Name; + + this.m_mapInherit.Add(entity, tn); if (tnParent != null) { @@ -243,12 +279,12 @@ private void LoadEntity(TreeNode tnParent, DocEntity entity) } else { - this.treeView.Nodes.Add(tn); + this.treeViewInheritance.Nodes.Add(tn); } if (this.m_selection == entity) { - this.treeView.SelectedNode = tn; + this.treeViewInheritance.SelectedNode = tn; } this.LoadPredefined(); @@ -286,10 +322,10 @@ private void LoadPredefined() this.comboBoxPredefined.SelectedIndex = -1; this.comboBoxPredefined.Text = String.Empty; - if (this.treeView.SelectedNode == null) + if (this.treeViewInheritance.SelectedNode == null) return; - DocEntity entity = this.treeView.SelectedNode.Tag as DocEntity; + DocEntity entity = this.treeViewInheritance.SelectedNode.Tag as DocEntity; if (entity == null) return; @@ -333,16 +369,16 @@ public DocDefinition SelectedEntity { get { - if (this.treeView.SelectedNode == null) + if (this.treeViewInheritance.SelectedNode == null) return null; - if (this.treeView.SelectedNode.Tag is DocDefinition) + if (this.treeViewInheritance.SelectedNode.Tag is DocDefinition) { - return this.treeView.SelectedNode.Tag as DocDefinition; + return this.treeViewInheritance.SelectedNode.Tag as DocDefinition; } - else if (this.treeView.SelectedNode.Tag is DocConstant) + else if (this.treeViewInheritance.SelectedNode.Tag is DocConstant) { - return this.treeView.SelectedNode.Parent.Tag as DocDefinition; + return this.treeViewInheritance.SelectedNode.Parent.Tag as DocDefinition; } return null; @@ -360,8 +396,31 @@ public DocConstant SelectedConstant } } - private void treeView_AfterSelect(object sender, TreeViewEventArgs e) + private void treeViewInheritance_AfterSelect(object sender, TreeViewEventArgs e) { + if (this.treeViewInheritance.SelectedNode == null) + return; + + DocDefinition entity = this.treeViewInheritance.SelectedNode.Tag as DocDefinition; + if (entity != null && this.m_mapAlpha.ContainsKey(entity)) + { + this.treeViewAlphabetical.SelectedNode = this.m_mapAlpha[entity]; + } + + this.LoadPredefined(); + } + + private void treeViewAlphabetical_AfterSelect(object sender, TreeViewEventArgs e) + { + if (this.treeViewAlphabetical.SelectedNode == null) + return; + + DocEntity entity = this.treeViewAlphabetical.SelectedNode.Tag as DocEntity; + if (entity != null) + { + this.treeViewInheritance.SelectedNode = this.m_mapInherit[entity]; + } + this.LoadPredefined(); } } diff --git a/FormSelectEntity.ja.resx b/FormSelectEntity.ja.resx index 1e26a21b..3d644657 100644 --- a/FormSelectEntity.ja.resx +++ b/FormSelectEntity.ja.resx @@ -117,19 +117,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - キャンセル - - - OK - - - 66, 13 - - - 定義済み型 - AAABAAgAICAQAAAAAADoAgAAhgAAABAQEAAAAAAAKAEAAG4DAAAwMAAAAQAIAKgOAACWBAAAICAAAAEA @@ -527,7 +515,4 @@ 0f/AAM//wADP/8AAzf/AAMv/wADK/8AAyP/AAMb/wADF/8APw/8= - - 定義をセレクト - \ No newline at end of file diff --git a/FormSelectEntity.resx b/FormSelectEntity.resx index 50e3a1ad..18ba8c19 100644 --- a/FormSelectEntity.resx +++ b/FormSelectEntity.resx @@ -117,25 +117,255 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Bottom, Right + - - 216, 471 + + 297, 471 - - 360, 402 + + 75, 23 - - 2 + + + 4 + + + Cancel + + + buttonCancel + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 $this - + + 3 + + + Bottom, Right + + + 216, 471 + + 75, 23 + + 3 + + + OK + + + buttonOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 4 + + + Fill + + + 3, 3 + + + 346, 376 + + + 0 + + + treeViewInheritance + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage1 + + + 0 + + + Bottom, Left, Right + + + False + + + 12, 440 + + + 359, 21 + + + 2 + + + comboBoxPredefined + + + System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + 2 + + + True + + + False + + + 9, 423 + + + 88, 13 + + 1 + + Predefined Type: + + + labelPredefined + + + System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top, Bottom, Left, Right + + + 4, 22 + + + 3, 3, 3, 3 + + + 352, 382 + + + 0 + + + Inheritance + + + tabPage1 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 0 + + + Fill + + + 3, 3 + + + 346, 376 + + + 1 + + + treeViewAlphabetical + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabPage2 + + + 0 + + + 4, 22 + + + 3, 3, 3, 3 + + + 352, 382 + + + 1 + + + Alphabetical + + + tabPage2 + + + System.Windows.Forms.TabPage, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + tabControl1 + + + 1 + + + 12, 12 + + + 360, 408 + + + 5 + + + tabControl1 + + + System.Windows.Forms.TabControl, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + + + 6, 13 + + + 384, 504 + AAABAAgAICAQAAAAAADoAgAAhgAAABAQEAAAAAAAKAEAAG4DAAAwMAAAAQAIAKgOAACWBAAAICAAAAEA @@ -533,147 +763,16 @@ 0f/AAM//wADP/8AAzf/AAMv/wADK/8AAyP/AAMb/wADF/8APw/8= - - - Top, Bottom, Left, Right - - - 12, 440 - - - - False - - - OK - - - True - - - Bottom, Right - - - System.Windows.Forms.ComboBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 4 - - - 9, 423 - - - 12, 12 - - - Predefined Type: - - - Bottom, Left, Right - - - 384, 504 - - - $this - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - buttonCancel - - - labelPredefined - - - False - - - Bottom, Right - - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 359, 21 - - - 88, 13 - - - $this - - - treeView - - - 1 - - - 4 - - - System.Windows.Forms.Label, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - $this - - - 3 - - - 297, 471 - - - 3 - - - 6, 13 - - - 0 - - - 75, 23 - - - 2 - - - comboBoxPredefined - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 0 - - - buttonOK - 400, 540 - - Cancel - Select Definition - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - FormSelectEntity - - True - - - ja - + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/FormSelectLocale.ja.resx b/FormSelectLocale.ja.resx index 62cfc82a..c95790e3 100644 --- a/FormSelectLocale.ja.resx +++ b/FormSelectLocale.ja.resx @@ -117,13 +117,19 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - OK + + + 216, 466 - - キャンセル + + 297, 466 + + + 359, 445 + + + 384, 501 - AAABAAYAMDAAAAEACACoDgAAZgAAACAgAAABAAgAqAgAAA4PAAAQEAAAAQAIAGgFAAC2FwAAMDAAAAEA @@ -503,7 +509,4 @@ AACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAwAEAAOADAADwB3jG//8Z/w== - - ロケールをセレクト - \ No newline at end of file diff --git a/FormSelectLocale.resx b/FormSelectLocale.resx index 4a5f0df3..1c6a17e1 100644 --- a/FormSelectLocale.resx +++ b/FormSelectLocale.resx @@ -117,18 +117,95 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Bottom, Right + - 216, 469 + 216, 466 + + + 75, 23 + + + + 1 + + + OK + + + buttonOK + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 2 + + + Bottom, Right + + + 297, 466 + + + 75, 23 + + + 2 Cancel + + buttonCancel + + + System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 1 + + + Top, Bottom, Left, Right + + + 13, 12 + + + 359, 445 + + + 3 + + + treeViewLocale + + + System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + $this + + + 0 + + + True + 6, 13 - - 75, 23 + + 384, 501 @@ -509,96 +586,16 @@ AACAAAAAgAAAAIAAAACAAAAAgAAAAIAAAACAAAAAwAEAAOADAADwB3jG//8Z/w== - - 359, 448 - - - System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - FormSelectLocale - - - - Bottom, Right - - - - 2 - - - $this - - - 1 - - - 384, 504 - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - buttonCancel - - - 0 - - - 3 - - - Bottom, Right - - - $this - - - 297, 469 - - - OK - - - 2 - - - buttonOK - - - 1 - - - treeViewLocale - - - $this - - - 75, 23 - - - Top, Bottom, Left, Right - - - System.Windows.Forms.Button, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Windows.Forms.TreeView, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 400, 540 Select Locale - - 13, 12 + + FormSelectLocale + + + System.Windows.Forms.Form, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - True - - - ja - \ No newline at end of file diff --git a/FormSelectProperty.Designer.cs b/FormSelectProperty.Designer.cs new file mode 100644 index 00000000..fd5fe69d --- /dev/null +++ b/FormSelectProperty.Designer.cs @@ -0,0 +1,107 @@ +namespace IfcDoc +{ + partial class FormSelectProperty + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(FormSelectProperty)); + this.treeViewProperty = new System.Windows.Forms.TreeView(); + this.buttonCancel = new System.Windows.Forms.Button(); + this.buttonOK = new System.Windows.Forms.Button(); + this.imageList = new System.Windows.Forms.ImageList(this.components); + this.SuspendLayout(); + // + // treeViewProperty + // + this.treeViewProperty.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.treeViewProperty.Location = new System.Drawing.Point(13, 12); + this.treeViewProperty.Name = "treeViewProperty"; + this.treeViewProperty.Size = new System.Drawing.Size(359, 445); + this.treeViewProperty.TabIndex = 6; + this.treeViewProperty.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeViewProperty_AfterSelect); + // + // buttonCancel + // + this.buttonCancel.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonCancel.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.buttonCancel.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonCancel.Location = new System.Drawing.Point(297, 466); + this.buttonCancel.Name = "buttonCancel"; + this.buttonCancel.Size = new System.Drawing.Size(75, 23); + this.buttonCancel.TabIndex = 5; + this.buttonCancel.Text = "Cancel"; + this.buttonCancel.UseVisualStyleBackColor = true; + // + // buttonOK + // + this.buttonOK.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; + this.buttonOK.ImeMode = System.Windows.Forms.ImeMode.NoControl; + this.buttonOK.Location = new System.Drawing.Point(216, 466); + this.buttonOK.Name = "buttonOK"; + this.buttonOK.Size = new System.Drawing.Size(75, 23); + this.buttonOK.TabIndex = 4; + this.buttonOK.Text = "OK"; + this.buttonOK.UseVisualStyleBackColor = true; + // + // imageList + // + this.imageList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imageList.ImageStream"))); + this.imageList.TransparentColor = System.Drawing.Color.Fuchsia; + this.imageList.Images.SetKeyName(0, "DocPropertySet.bmp"); + this.imageList.Images.SetKeyName(1, "DocProperty.bmp"); + // + // FormSelectProperty + // + this.AcceptButton = this.buttonOK; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.buttonCancel; + this.ClientSize = new System.Drawing.Size(384, 501); + this.Controls.Add(this.treeViewProperty); + this.Controls.Add(this.buttonCancel); + this.Controls.Add(this.buttonOK); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "FormSelectProperty"; + this.Text = "Select Property"; + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.TreeView treeViewProperty; + private System.Windows.Forms.Button buttonCancel; + private System.Windows.Forms.Button buttonOK; + private System.Windows.Forms.ImageList imageList; + + } +} \ No newline at end of file diff --git a/FormSelectProperty.cs b/FormSelectProperty.cs new file mode 100644 index 00000000..2669ea62 --- /dev/null +++ b/FormSelectProperty.cs @@ -0,0 +1,135 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +using IfcDoc.Schema.DOC; + +namespace IfcDoc +{ + public partial class FormSelectProperty : Form + { + DocEntity m_entity; + DocProject m_project; + + public FormSelectProperty() + { + InitializeComponent(); + } + + public FormSelectProperty(DocEntity docEntity, DocProject docProject, bool multiselect) : this() + { + this.m_entity = docEntity; + this.m_project = docProject; + + if (multiselect) + { + this.treeViewProperty.CheckBoxes = true; + this.Text = "Include Property Sets"; + } + + foreach(DocSection docSection in this.m_project.Sections) + { + foreach(DocSchema docSchema in docSection.Schemas) + { + foreach(DocPropertySet docPset in docSchema.PropertySets) + { + bool include = false; + if (docPset.ApplicableType != null) + { + string[] parts = docPset.ApplicableType.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries); + foreach(string part in parts) + { + DocEntity docBase = docEntity; + while (docBase != null) + { + if (part.Contains(docBase.Name)) + { + include = true; + break; + } + + docBase = this.m_project.GetDefinition(docBase.BaseDefinition) as DocEntity; + } + } + } + + if (this.m_entity == null || include) + { + TreeNode tnPset = new TreeNode(); + tnPset.Tag = docPset; + tnPset.Text = docPset.Name; + this.treeViewProperty.Nodes.Add(tnPset); + + if (!this.treeViewProperty.CheckBoxes) + { + foreach (DocProperty docProp in docPset.Properties) + { + TreeNode tnProp = new TreeNode(); + tnProp.Tag = docProp; + tnProp.Text = docProp.Name; + tnPset.Nodes.Add(tnProp); + } + } + } + } + } + } + + this.treeViewProperty.ExpandAll(); + } + + private void treeViewProperty_AfterSelect(object sender, TreeViewEventArgs e) + { + this.buttonOK.Enabled = (this.treeViewProperty.CheckBoxes || (this.treeViewProperty.SelectedNode != null && this.treeViewProperty.SelectedNode.Tag is DocProperty)); + } + + public DocProperty SelectedProperty + { + get + { + if(this.treeViewProperty.SelectedNode != null && this.treeViewProperty.SelectedNode.Tag is DocProperty) + { + return (DocProperty)this.treeViewProperty.SelectedNode.Tag; + } + + return null; + } + } + + public DocPropertySet SelectedPropertySet + { + get + { + if(this.treeViewProperty.SelectedNode != null && this.treeViewProperty.SelectedNode.Tag is DocProperty) + { + return (DocPropertySet)this.treeViewProperty.SelectedNode.Parent.Tag; + } + + return null; + } + } + + public DocPropertySet[] IncludedPropertySets + { + get + { + List list = new List(); + foreach(TreeNode tn in this.treeViewProperty.Nodes) + { + if(tn.Checked) + { + list.Add((DocPropertySet)tn.Tag); + } + } + + return list.ToArray(); + } + } + } +} diff --git a/FormSelectProperty.resx b/FormSelectProperty.resx new file mode 100644 index 00000000..dd08f8e7 --- /dev/null +++ b/FormSelectProperty.resx @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + + AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w + LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 + ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAC6 + CQAAAk1TRnQBSQFMAgEBAgEAAQgBAAEIAQABEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA + AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 + AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA + AWYDAAGZAwABzAIAATMDAAIzAgABMwFmAgABMwGZAgABMwHMAgABMwH/AgABZgMAAWYBMwIAAmYCAAFm + AZkCAAFmAcwCAAFmAf8CAAGZAwABmQEzAgABmQFmAgACmQIAAZkBzAIAAZkB/wIAAcwDAAHMATMCAAHM + AWYCAAHMAZkCAALMAgABzAH/AgAB/wFmAgAB/wGZAgAB/wHMAQABMwH/AgAB/wEAATMBAAEzAQABZgEA + ATMBAAGZAQABMwEAAcwBAAEzAQAB/wEAAf8BMwIAAzMBAAIzAWYBAAIzAZkBAAIzAcwBAAIzAf8BAAEz + AWYCAAEzAWYBMwEAATMCZgEAATMBZgGZAQABMwFmAcwBAAEzAWYB/wEAATMBmQIAATMBmQEzAQABMwGZ + AWYBAAEzApkBAAEzAZkBzAEAATMBmQH/AQABMwHMAgABMwHMATMBAAEzAcwBZgEAATMBzAGZAQABMwLM + AQABMwHMAf8BAAEzAf8BMwEAATMB/wFmAQABMwH/AZkBAAEzAf8BzAEAATMC/wEAAWYDAAFmAQABMwEA + AWYBAAFmAQABZgEAAZkBAAFmAQABzAEAAWYBAAH/AQABZgEzAgABZgIzAQABZgEzAWYBAAFmATMBmQEA + AWYBMwHMAQABZgEzAf8BAAJmAgACZgEzAQADZgEAAmYBmQEAAmYBzAEAAWYBmQIAAWYBmQEzAQABZgGZ + AWYBAAFmApkBAAFmAZkBzAEAAWYBmQH/AQABZgHMAgABZgHMATMBAAFmAcwBmQEAAWYCzAEAAWYBzAH/ + AQABZgH/AgABZgH/ATMBAAFmAf8BmQEAAWYB/wHMAQABzAEAAf8BAAH/AQABzAEAApkCAAGZATMBmQEA + AZkBAAGZAQABmQEAAcwBAAGZAwABmQIzAQABmQEAAWYBAAGZATMBzAEAAZkBAAH/AQABmQFmAgABmQFm + ATMBAAGZATMBZgEAAZkBZgGZAQABmQFmAcwBAAGZATMB/wEAApkBMwEAApkBZgEAA5kBAAKZAcwBAAKZ + Af8BAAGZAcwCAAGZAcwBMwEAAWYBzAFmAQABmQHMAZkBAAGZAswBAAGZAcwB/wEAAZkB/wIAAZkB/wEz + AQABmQHMAWYBAAGZAf8BmQEAAZkB/wHMAQABmQL/AQABzAMAAZkBAAEzAQABzAEAAWYBAAHMAQABmQEA + AcwBAAHMAQABmQEzAgABzAIzAQABzAEzAWYBAAHMATMBmQEAAcwBMwHMAQABzAEzAf8BAAHMAWYCAAHM + AWYBMwEAAZkCZgEAAcwBZgGZAQABzAFmAcwBAAGZAWYB/wEAAcwBmQIAAcwBmQEzAQABzAGZAWYBAAHM + ApkBAAHMAZkBzAEAAcwBmQH/AQACzAIAAswBMwEAAswBZgEAAswBmQEAA8wBAALMAf8BAAHMAf8CAAHM + Af8BMwEAAZkB/wFmAQABzAH/AZkBAAHMAf8BzAEAAcwC/wEAAcwBAAEzAQAB/wEAAWYBAAH/AQABmQEA + AcwBMwIAAf8CMwEAAf8BMwFmAQAB/wEzAZkBAAH/ATMBzAEAAf8BMwH/AQAB/wFmAgAB/wFmATMBAAHM + AmYBAAH/AWYBmQEAAf8BZgHMAQABzAFmAf8BAAH/AZkCAAH/AZkBMwEAAf8BmQFmAQAB/wKZAQAB/wGZ + AcwBAAH/AZkB/wEAAf8BzAIAAf8BzAEzAQAB/wHMAWYBAAH/AcwBmQEAAf8CzAEAAf8BzAH/AQAC/wEz + AQABzAH/AWYBAAL/AZkBAAL/AcwBAAJmAf8BAAFmAf8BZgEAAWYC/wEAAf8CZgEAAf8BZgH/AQAC/wFm + AQABIQEAAaUBAANfAQADdwEAA4YBAAOWAQADywEAA7IBAAPXAQAD3QEAA+MBAAPqAQAD8QEAA/gBAAHw + AfsB/wEAAaQCoAEAA4ADAAH/AgAB/wMAAv8BAAH/AwAB/wEAAf8BAAL/AgAD/wYAAfQBpgEZPAAB9AGt + AbMBpgH0BwABrgtmJwAB9AGtAdsB1QGzAaYB9AYAAZEB/wLyAfEB8AG8AwkBtQFmJgAB9AG0AtwB2wHV + AbMBpgH0AQAB9AMAAZEB/wH3Ae0B9AL3Ae0BkQEZAbUBZicAAfQBtALcAdsB1QGzAaYB9AGCAfQCAAGR + A/8B9QL0AxkBtQFmJwAC8AG0AtwB2wGtAfIBggGwAYIB9AEAAZEB/wH3Ae0B9QL3Ae0BkQEZAbsBZiYA + ARsCKgHwAbQB3AGtAfIBggHYAbYBsAGCAfQB7QX/AvUB9AEZAQcBZiUAARsBKgJZASoB8AG0AfIBsAPY + AbYBsAGCAfcB/wG8AfEB/wK8Ae8BSgH0AbwBbAMAAfQgAAEbASoBegNZASoBvAGwA94C2AGwAfQB9wH/ + AfMBbgHyAf8B7gFKAVIBQwEHAW0CAAHvAU8gAAEqAZoCegNZASoBGgGwA94BsAH0AQABtAEJARwBmQFK + Ae0BSgF5AeoBWQEQAiIB+AFJAVAgAAExAaABmgJ6A1kBKgEaAbAB3gGwAfQCAAG0AgkBHAGaAUoBeQHq + AXoBSgFYAlIBSgJQIAABGwExAaABmgJ6A1kBKgEbAbAB9AMAA7QBCQEcAZoBSgGaAUoCegFZAVgBUgFy + AZchAAEbATEBoAGaAnoBWQExARsBAAH0BwAB/wHzARwBmgFKAZoDegJZAXMBlyIAARsBMQGgAZoBegEx + ARsMAAHzARwDmgJ6AXkB7AKYIwABGwExAaABMQEaDgAB8wMcAe0BcwHsAe4CmCQAARsBMQEbOQABQgFN + AT4HAAE+AwABKAMAAUADAAEQAwABAQEAAQEFAAGAFwAD/wEAAfgD/wQAAfABfwEAAQ8EAAHgAT8BAAEP + BAABwAEXAQABDwQAAeABAwEAAQ8EAAHgAQEBAAEPBAABwAIAAQ8EAAGAAgABDgcAAQwFAAEBBwABAwcA + AQcGAAGAAS8B4AUAAcABfwH4BQAB4AH/AfwFAAHxA/8EAAs= + + + \ No newline at end of file diff --git a/FormatEXP.cs b/FormatEXP.cs index 33c5354d..c325cb9c 100644 --- a/FormatEXP.cs +++ b/FormatEXP.cs @@ -69,9 +69,10 @@ public DocModelView[] ModelViews /// /// Replaces references to schemas with longform schema name, e.g. IFC4. /// - /// + /// The expression to read + /// The schema identifier to use, such as 'IFC4' /// - private string MakeLongFormExpression(string expression) + private string MakeLongFormExpression(string expression, string schemaidentifier) { if (expression == null) return null; @@ -79,7 +80,7 @@ private string MakeLongFormExpression(string expression) if (!this.m_longform) return expression; - string replace = "'IFC4."; + string replace = "'" + schemaidentifier + "."; foreach (DocSection docSection in this.m_project.Sections) { foreach (DocSchema docSchema in docSection.Schemas) @@ -119,7 +120,10 @@ public void Save() { if (docType is DocDefined) { - mapDefined.Add(docType.Name, (DocDefined)docType); + if (!mapDefined.ContainsKey(docType.Name)) + { + mapDefined.Add(docType.Name, (DocDefined)docType); + } } else if (docType is DocEnumeration) { @@ -130,7 +134,10 @@ public void Save() mapSelect.Add(docType.Name, (DocSelect)docType); } - mapGeneral.Add(docType.Name, docType); + if (!mapGeneral.ContainsKey(docType.Name)) + { + mapGeneral.Add(docType.Name, docType); + } } } @@ -262,7 +269,7 @@ public void Save() writer.Write("\t"); writer.Write(where.Name); writer.Write(" : "); - writer.Write(MakeLongFormExpression(where.Expression)); + writer.Write(MakeLongFormExpression(where.Expression, schemaid)); writer.WriteLine(";"); } } @@ -582,7 +589,7 @@ public void Save() writer.Write("\t"); writer.Write(where.Name); writer.Write(" : "); - writer.Write(MakeLongFormExpression(where.Expression)); + writer.Write(MakeLongFormExpression(where.Expression, schemaid)); writer.WriteLine(";"); } } @@ -596,7 +603,7 @@ public void Save() { writer.Write("FUNCTION "); writer.WriteLine(docFunction.Name); - writer.WriteLine(MakeLongFormExpression(docFunction.Expression)); + writer.WriteLine(MakeLongFormExpression(docFunction.Expression, schemaid)); writer.WriteLine("END_FUNCTION;"); writer.WriteLine(); } @@ -620,7 +627,7 @@ public void Save() writer.Write(" "); writer.Write(docWhere.Name); writer.Write(" : "); - writer.Write(MakeLongFormExpression(docWhere.Expression)); + writer.Write(MakeLongFormExpression(docWhere.Expression, schemaid)); writer.WriteLine(";"); } diff --git a/FormatHTM.cs b/FormatHTM.cs index a928d7ba..f2a47515 100644 --- a/FormatHTM.cs +++ b/FormatHTM.cs @@ -269,7 +269,17 @@ private string FormatDefinition(string definition) string hyperlink = @"../../../schema/" + schema.ToLower() + @"/lexical/" + definition.ToLower() + ".htm"; return "" + definition + ""; } - else + else if(ent is DocPropertySet || ent is DocPropertyEnumeration) + { + string hyperlink = @"../../" + schema.ToLower() + @"/pset/" + definition.ToLower() + ".htm"; + return "" + definition + ""; + } + else if(ent is DocQuantitySet) + { + string hyperlink = @"../../" + schema.ToLower() + @"/qset/" + definition.ToLower() + ".htm"; + return "" + definition + ""; + } + else //if (ent is DocDefinition) { string hyperlink = @"../../" + schema.ToLower() + @"/lexical/" + definition.ToLower() + ".htm"; return "" + definition + ""; @@ -1073,7 +1083,7 @@ public void WriteExpressGlobalRule(DocGlobalRule entity) /// /// The caption to use, e.g. "Entities" /// The locale for which to generate listings or NULL for default locale. - public void WriteLocalizedListing(string caption, string locale) where T : DocObject + public void WriteLocalizedListing(string caption, string locale, string path, string name) where T : DocObject { SortedList alphaMissing = new SortedList(); @@ -1166,10 +1176,19 @@ public void WriteLocalizedListing(string caption, string locale) where T : Do this.WriteLine("

    "); } + string linkid = locale.Substring(0,2) + "-alphabeticalorder-" + caption.ToLower().Replace(' ', '-'); + this.WriteLinkTo(linkid, 3); + + this.WriteFooter(Properties.Settings.Default.Footer); + + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + linkid + ".htm", this.m_mapEntity, this.m_mapSchema, this.m_included)) + { + htmLink.WriteLinkPage("../annex/annex-b/" + locale.Substring(0,2).ToLower() + "/alphabeticalorder_" + name + ".htm"); + } } - public void WriteAlphabeticalListing(string caption, string pagefooter) where T : DocObject + public void WriteAlphabeticalListing(string caption, string path, string name) where T : DocObject { SortedList alphaEntity = new SortedList(); foreach (string s in this.m_mapEntity.Keys) @@ -1209,7 +1228,14 @@ public void WriteAlphabeticalListing(string caption, string pagefooter) where this.WriteLine("
"); - this.WriteFooter(pagefooter); + string linkid = "alphabeticalorder-" + caption.ToLower().Replace(' ', '-'); + this.WriteLinkTo(linkid, 2); + this.WriteFooter(Properties.Settings.Default.Footer); + + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + linkid + ".htm", this.m_mapEntity, this.m_mapSchema, this.m_included)) + { + htmLink.WriteLinkPage("../annex/annex-b/alphabeticalorder_" + name.ToLower() + ".htm"); + } } public void WriteInheritanceMapping(DocProject docProject, DocModelView[] views) @@ -1368,7 +1394,7 @@ private void WriteInheritanceMappingLevel(string baseclass, IList lis /// /// /// Name of base class or null for all entities - public void WriteInheritanceListing(string baseclass, bool predefined, string caption) + public void WriteInheritanceListing(string baseclass, bool predefined, string caption, DocModelView docView, string path, string filename) { SortedList alphaEntity = new SortedList(); foreach (string s in this.m_mapEntity.Keys) @@ -1387,7 +1413,15 @@ public void WriteInheritanceListing(string baseclass, bool predefined, string ca WriteInheritanceLevel(baseclass, alphaEntity.Values, predefined); this.WriteLine(""); + + string linkid = "inheritance-" + DocumentationISO.MakeLinkName(docView) + "-" + caption.ToLower(); + this.WriteLinkTo(linkid, 3); this.WriteFooter(Properties.Settings.Default.Footer); + + using (FormatHTM htmLink = new FormatHTM(path + "/link/" + linkid + ".htm", this.m_mapEntity, this.m_mapSchema, this.m_included)) + { + htmLink.WriteLinkPage("../annex/annex-c/" + DocumentationISO.MakeLinkName(docView) + "/" + filename + ".htm"); + } } private void WriteInheritanceLevel(string baseclass, IList list, bool predefined) @@ -1552,7 +1586,7 @@ public void WriteDocumentationForISO(string content, DocObject current, bool sup // remove excluded sections for ISO (may include nested blocks) index = 0; - while (index >= 0) + while (index >= 0 && index < content.Length) { index = content.IndexOf("
", index, StringComparison.OrdinalIgnoreCase); if (index >= 0) @@ -1587,6 +1621,11 @@ public void WriteDocumentationForISO(string content, DocObject current, bool sup string block = content.Substring(index, end - index + prelen + 4); string def = content.Substring(index + prelen + 3, end - index - prelen - 3); + if(def.StartsWith("Pset_")) + { + this.ToString(); + } + DocObject docDef = null; if (this.m_mapEntity.TryGetValue(def, out docDef) && (this.m_included == null || this.m_included.ContainsKey(docDef))) { @@ -1777,6 +1816,17 @@ internal void WriteScript(int iSection, int iSchema, int iType, int iItem) "//-->\r\n" + "\r\n"); } + else if (chAnnex == 'E') + { + // 1 level up + this.WriteLine( + "\r\n" + + "\r\n"); + } else { // 1 level up @@ -1841,76 +1891,6 @@ internal void WriteScript(int iSection, int iSchema, int iType, int iItem) } } - internal void WriteFigureContentsForTemplate(DocTemplateDefinition def, ref int iFigure) - { - if (this.m_included == null || this.m_included.ContainsKey(def)) - { - if (def.Rules != null && def.Rules.Count > 0) - { - iFigure++; - this.m_writer.WriteLine("Figure " + iFigure.ToString() + " — " + def.Name + "
"); - } - - if (def.Templates != null) - { - foreach (DocTemplateDefinition sub in def.Templates) - { - WriteFigureContentsForTemplate(sub, ref iFigure); - } - } - } - } - - internal void WriteFigureContents(DocObject def) - { - if (this.m_included == null || this.m_included.ContainsKey(def)) - { - - string html = def.Documentation; - if (html != null) - { - - int index = 0; - for (int count = 0; ; count++) - { - index = html.IndexOf("

", index); - if (index == -1) - break; - - //

Figure 278 — Circle geometry

- - // get the existing figure number, add it to list - int head = index + 25; - int tail = html.IndexOf(" —", index); - if (tail > head) - { - string exist = html.Substring(head, tail - head); - int result = 0; - if (Int32.TryParse(exist, out result)) - { - int nametail = html.IndexOf("<", tail); - string figurename = html.Substring(tail + 9, nametail - tail - 9); - - string schema; - this.m_mapSchema.TryGetValue(def.Name, out schema); - if (schema != null) - { - this.m_writer.WriteLine("Figure " + exist.ToString() + " — " + figurename + "
"); - } - else - { - // schema page - this.m_writer.WriteLine("Figure " + exist.ToString() + " — " + figurename + "
"); - } - } - } - - index++; - } - } - } - } - internal void WriteContentRefs(List listFigures, string prefix) { for (int iFigure = 0; iFigure < listFigures.Count; iFigure++) @@ -1918,72 +1898,26 @@ internal void WriteContentRefs(List listFigu DocObject target = listFigures[iFigure].Page; string figurename = listFigures[iFigure].Caption; - this.m_writer.Write(""); + link = "schema/templates/" + DocumentationISO.MakeLinkName(target) + ".htm"; } else if (target is DocEntity || target is DocType) { string schema = this.m_mapSchema[target.Name]; - this.m_writer.WriteLine(schema.ToLower() + "/lexical/" + target.Name.ToLower() + ".htm\">"); + link = "schema/" + schema.ToLower() + "/lexical/" + DocumentationISO.MakeLinkName(target) + ".htm"; } else if (target is DocSchema) { - this.m_writer.WriteLine(target.Name.ToLower() + "/content.htm\">"); + link = "schema/" + target.Name.ToLower() + "/content.htm"; } - - this.m_writer.WriteLine(prefix + " " + (iFigure + 1).ToString() + " — " + figurename + "
"); - } - } - - internal void WriteTableContents(DocObject def) - { - if (this.m_included == null || this.m_included.ContainsKey(def)) - { - - string html = def.Documentation; - if (html == null) - return; - - int index = 0; - for (int count = 0; ; count++) + else if (target is DocExample) { - index = html.IndexOf("

", index); - if (index == -1) - break; - - //

Table 278 — Circle geometry

- - // get the existing figure number, add it to list - int head = index + 23; - int tail = html.IndexOf(" —", index); - if (tail > head) - { - string exist = html.Substring(head, tail - head); - int result = 0; - if (Int32.TryParse(exist, out result)) - { - int nametail = html.IndexOf("<", tail); - string figurename = html.Substring(tail + 9, nametail - tail - 9); - - string schema; - this.m_mapSchema.TryGetValue(def.Name, out schema); - if (schema != null) - { - this.m_writer.WriteLine("Table " + exist.ToString() + " — " + figurename + "
"); - } - else - { - // schema page - this.m_writer.WriteLine("Table " + exist.ToString() + " — " + figurename + "
"); - } - } - } - - index++; + link = "annex/annex-e/" + DocumentationISO.MakeLinkName(target) + ".htm"; } + + this.m_writer.WriteLine("" + prefix + " " + (iFigure + 1).ToString() + " — " + figurename + "
"); } } @@ -2176,7 +2110,10 @@ public void WriteExpressSchema(DocProject docProject) { if (docType is DocDefined) { - mapDefined.Add(docType.Name, (DocDefined)docType); + if (!mapDefined.ContainsKey(docType.Name)) + { + mapDefined.Add(docType.Name, (DocDefined)docType); + } } else if (docType is DocEnumeration) { @@ -2187,7 +2124,10 @@ public void WriteExpressSchema(DocProject docProject) mapSelect.Add(docType.Name, (DocSelect)docType); } - mapGeneral.Add(docType.Name, docType); + if (!mapGeneral.ContainsKey(docType.Name)) + { + mapGeneral.Add(docType.Name, docType); + } } } @@ -2317,7 +2257,12 @@ public int Compare(string x, string y) internal void WriteProperties(List list) { - this.WriteLine("
    \r\n"); + if (list.Count == 0) + return; + + this.WriteLine(""); + this.WriteLine(""); + foreach (DocProperty docprop in list) { string datatype = docprop.PrimaryDataType; @@ -2326,7 +2271,7 @@ internal void WriteProperties(List list) datatype = "IfcLabel"; } - this.WriteLine("
  • " + docprop.Name + "
    "); + this.WriteLine("
  • NameTypeDescription
    " + docprop.Name + ""); this.WriteDefinition(docprop.PropertyType.ToString()); this.WriteLine("/"); this.WriteDefinition(datatype.Trim()); @@ -2335,7 +2280,6 @@ internal void WriteProperties(List list) this.WriteLine("/"); string[] parts = docprop.SecondaryDataType.Split(':'); - //this.WriteDefinition(parts[0]); string enumname = parts[0]; DocObject docObj = null; string schema = null; @@ -2348,40 +2292,74 @@ internal void WriteProperties(List list) this.WriteDefinition(docprop.SecondaryDataType.Trim().Replace(",", ", ").Replace(":", ": ")); } } - this.WriteLine("
    "); - - this.WriteLine(""); + this.WriteLine(""); + bool showdefaultdesc = true; docprop.Localization.Sort(); - foreach (DocLocalization doclocal in docprop.Localization) - { - string localname = doclocal.Name; - string localdesc = doclocal.Documentation; - string localid = doclocal.Locale.Substring(0, 2).ToLower(); - if (localid.Equals("en", StringComparison.InvariantCultureIgnoreCase) && localdesc == null) + if (docprop.Localization.Count > 0) + { + this.WriteLine("
    "); // english by default //this.WriteLine("
    " + docprop.Name + ": " + docprop.Documentation + "
    "); + foreach (DocLocalization doclocal in docprop.Localization) { - localdesc = docprop.Documentation; - } + string localname = doclocal.Name; + string localdesc = doclocal.Documentation; + string localid = doclocal.Locale.Substring(0, 2).ToLower(); + + if (String.IsNullOrEmpty(doclocal.Documentation) && localid.Equals("en", StringComparison.InvariantCultureIgnoreCase) && localdesc == null) + { + localdesc = docprop.Documentation; + showdefaultdesc = false; + } - this.WriteLine(""); + this.WriteLine(""); + } + this.WriteLine("
    " + localname + ": " + localdesc + "
    " + localname + "" + localdesc + "
    "); } - this.WriteLine("
    "); + if(showdefaultdesc) + { + this.WriteLine(docprop.Documentation); // locale-generic + } // complex properties if (docprop.Elements != null) { WriteProperties(docprop.Elements); } + + this.WriteLine(""); } - this.WriteLine("
\r\n"); + + this.WriteLine(""); } + internal void WriteLinkTo(DocObject type) + { + int levels = 3; + if (type is DocExample || type is DocTemplateDefinition || type is DocSchema) + { + levels = 2; + } + + this.WriteLinkTo(DocumentationISO.MakeLinkName(type), levels); + } + + internal void WriteLinkTo(string identifier, int levels) + { + string up = ""; + for (int i = 0; i < levels; i++ ) + { + up += "../"; + } + + this.WriteLine("

\"Link  Link to this page

"); + } + internal void WriteLinkPage(string linkurl) { this.WriteLine( @@ -2469,12 +2447,12 @@ internal void WriteComputerListing(string name, string code, int iCodeView) "" + "" + "IFC EXPRESS long form schema" + - "" + code + ".exp" + + "" + code + ".exp" + "" + code + ".exp.htm" + "" + "" + "IFC XSD long form schema" + - "" + codexml + ".xsd" + + "" + codexml + ".xsd" + "" + codexml + ".xsd.htm" + "" + ""); @@ -2494,12 +2472,12 @@ internal void WriteComputerListing(string name, string code, int iCodeView) "" + "" + "IFC-SPF property and quantity templates" + - "" + code + ".ifc" + + "" + code + ".ifc" + " " + "" + "" + "IFC-XML property and quantity templates" + - "" + code + ".ifcxml" + + "" + code + ".ifcxml" + " " + "" + @@ -2523,17 +2501,18 @@ internal void WriteComputerListing(string name, string code, int iCodeView) "" + "" + "MVD-XML model view definitions" + - "" + code + ".mvdxml" + + "" + code + ".mvdxml" + " " + "" + "" + "EXPRESS XSD configuration" + - "" + code + ".xml" + + "" + code + ".xml" + " " + "" + ""); } + this.WriteLinkTo("listing-" + code.ToLower(), 3); this.WriteFooter(Properties.Settings.Default.Footer); } @@ -2601,18 +2580,25 @@ public void WriteLocalizedNames(DocDefinition entity) this.WriteLine(""); } - public void WriteEntityInheritance(DocEntity entity, DocEntity treeleaf, ref int sequence) + public void WriteEntityInheritance(DocEntity entity, DocEntity treeleaf, DocModelView[] views, Dictionary[] viewmap, ref int sequence) { if (entity.BaseDefinition != null) { if (this.m_mapEntity.ContainsKey(entity.BaseDefinition)) { DocEntity baseEntity = (DocEntity)this.m_mapEntity[entity.BaseDefinition]; - WriteEntityInheritance(baseEntity, treeleaf, ref sequence); + WriteEntityInheritance(baseEntity, treeleaf, views, viewmap, ref sequence); } } - this.Write(""); + int colspan = 5; + + if (views != null) + { + colspan += views.Length; + } + + this.Write(""); if(entity.IsAbstract()) { this.Write(""); @@ -2624,7 +2610,27 @@ public void WriteEntityInheritance(DocEntity entity, DocEntity treeleaf, ref int } this.WriteLine(""); - WriteEntityAttributes(entity, treeleaf, ref sequence); + WriteEntityAttributes(entity, treeleaf, views, viewmap, ref sequence); + } + + private void WriteEntityAttributeViews(DocAttribute docAttr, DocModelView[] views, Dictionary[] viewmap) + { + if (views == null || viewmap == null) + return; + + for (int iView = 0; iView < viewmap.Length; iView++) + { + if (viewmap[iView] != null) + { + this.m_writer.Write(""); + bool included = false; + if (viewmap[iView].TryGetValue(docAttr, out included)) + { + this.m_writer.Write("X"); + } + this.m_writer.Write(""); + } + } } /// @@ -2633,7 +2639,7 @@ public void WriteEntityInheritance(DocEntity entity, DocEntity treeleaf, ref int /// /// /// Last sequence number used (0 initially) - public void WriteEntityAttributes(DocEntity entity, DocEntity treeleaf, ref int sequence) + public void WriteEntityAttributes(DocEntity entity, DocEntity treeleaf, DocModelView[] views, Dictionary[] viewmap, ref int sequence) { bool bInverse = false; bool bDerived = false; @@ -2730,7 +2736,9 @@ public void WriteEntityAttributes(DocEntity entity, DocEntity treeleaf, ref int { this.m_writer.Write("This attribute is out of scope for this model view definition and shall not be set."); } - this.m_writer.WriteLine(""); + this.m_writer.Write(""); + this.WriteEntityAttributeViews(attr, views, viewmap); + this.m_writer.WriteLine(""); } } @@ -2773,7 +2781,11 @@ public void WriteEntityAttributes(DocEntity entity, DocEntity treeleaf, ref int this.m_writer.Write(""); this.WriteDocumentationForISO(attr.Documentation, entity, suppresshistory); - this.m_writer.WriteLine(""); + this.m_writer.Write(""); + + this.WriteEntityAttributeViews(attr, views, viewmap); + + this.m_writer.WriteLine(""); } } } @@ -2841,7 +2853,11 @@ public void WriteEntityAttributes(DocEntity entity, DocEntity treeleaf, ref int this.m_writer.Write(""); this.WriteDocumentationForISO(attr.Documentation, entity, suppresshistory); - this.m_writer.WriteLine(""); + this.m_writer.WriteLine(""); + + this.WriteEntityAttributeViews(attr, views, viewmap); + + this.m_writer.WriteLine(""); } } @@ -2888,6 +2904,15 @@ internal void WriteChangeLog(DocDefinition entity, DocProject docProject) { mapChange.Add(docChangeSet, docChangeEntity); } + else + { + // overwrite with new schema + DocChangeAction docPrev = mapChange[docChangeSet]; + if(docChangeEntity.Changes.Count > docPrev.Changes.Count) + { + mapChange[docChangeSet] = docChangeEntity; + } + } } catch { diff --git a/FormatPNG.cs b/FormatPNG.cs index 9ab7808d..50d363e8 100644 --- a/FormatPNG.cs +++ b/FormatPNG.cs @@ -302,6 +302,7 @@ private static void DrawAttribute( g.FillEllipse(Brushes.Blue, new Rectangle(x + CX - DX - CY, y + CY * (iAttr+1), CY, CY)); } +#if false string card = ruleAttribute.GetCardinalityExpression(); if (g != null && card != null) { @@ -329,6 +330,7 @@ private static void DrawAttribute( } } } +#endif } } diff --git a/FormatSPF.cs b/FormatSPF.cs index 9f5c02cc..003d7220 100644 --- a/FormatSPF.cs +++ b/FormatSPF.cs @@ -1307,7 +1307,14 @@ private System.Collections.IList ParseList(Type t, string line) nExpectedCount++; if (value != null) { - list.Add(value); + try + { + list.Add(value); + } + catch(ArgumentException e) + { + this.m_errors.Add("#" + this.m_currentinstance + " - " + e.Message); + } } else { @@ -1497,7 +1504,7 @@ private Type ParseType(string line) if (t == null) { - System.Diagnostics.Debug.WriteLine(strType); + //System.Diagnostics.Debug.WriteLine(strType); return null; } diff --git a/FormatXSD.cs b/FormatXSD.cs index a67de790..2b644ef7 100644 --- a/FormatXSD.cs +++ b/FormatXSD.cs @@ -137,7 +137,10 @@ public void Save() { if (docType is DocDefined) { - mapDefined.Add(docType.Name, (DocDefined)docType); + if (!mapDefined.ContainsKey(docType.Name)) + { + mapDefined.Add(docType.Name, (DocDefined)docType); + } } else if (docType is DocEnumeration) { diff --git a/IfcDoc.csproj b/IfcDoc.csproj index 8697f3a3..51b1da02 100644 --- a/IfcDoc.csproj +++ b/IfcDoc.csproj @@ -133,6 +133,13 @@ CtlRules.cs + + + Form + + + FormSelectProperty.cs + Form @@ -349,6 +356,30 @@ CtlRules.cs + + FormConstraint.cs + + + FormMerge.cs + + + FormPublish.cs + + + FormReference.cs + + + FormRule.cs + + + FormSelectEntity.cs + + + FormSelectLocale.cs + + + FormSelectProperty.cs + FormValidate.cs diff --git a/IfcDoc.sln b/IfcDoc.sln index bdc0aca9..1d5be609 100644 --- a/IfcDoc.sln +++ b/IfcDoc.sln @@ -1,6 +1,8 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2012 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IfcDoc", "IfcDoc.csproj", "{BD604C7F-1CA2-4399-AC38-AD9CA45E7413}" EndProject Global diff --git a/IfcDoc.v12.suo b/IfcDoc.v12.suo index 1ba3cae152d1bff54ebd633f4f14f227b72223fa..f3287238ec8794d8ef9a4202e24c475bbffd619c 100644 GIT binary patch literal 492544 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 literal 299520 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 G`TqeG#gPvH diff --git a/NBIMS.cs b/NBIMS.cs index f241c313..05db559e 100644 --- a/NBIMS.cs +++ b/NBIMS.cs @@ -27,15 +27,20 @@ private static string GenerateTemplateImage(DocTemplateDefinition docTemplate, D int cx = 0; int cy = 0; - using (System.Drawing.Image image = IfcDoc.Format.PNG.FormatPNG.CreateTemplateDiagram(docTemplate, mapEntity, new Dictionary(), project, null)) + System.Drawing.Image image = IfcDoc.Format.PNG.FormatPNG.CreateTemplateDiagram(docTemplate, mapEntity, new Dictionary(), project, null); + + if (image != null) { - cx = image.Width; - cy = image.Height; - string filepath = path + "\\" + docTemplate.Name.ToLower().Replace(' ', '-') + ".png"; - image.Save(filepath, System.Drawing.Imaging.ImageFormat.Png); + using (image) + { + cx = image.Width; + cy = image.Height; + string filepath = path + "\\" + docTemplate.Name.ToLower().Replace(' ', '-') + ".png"; + image.Save(filepath, System.Drawing.Imaging.ImageFormat.Png); - cx = cx / 2; - cy = cy / 2; + cx = cx / 2; + cy = cy / 2; + } } return "
"; @@ -1037,7 +1042,7 @@ public static void Export(DocProject project, DocModelView docView, string path, private static void WriteModelRule(FormatHTM format, DocModelRule docRule, string path) { - format.Write("" + path + "" + docRule.GetCardinalityExpression() + "" + docRule.Identification + ""); + format.Write("" + path + "" + /*docRule.GetCardinalityExpression() + */"" + docRule.Identification + ""); if (docRule.Rules != null) { diff --git a/Program.cs b/Program.cs index 0793a2d5..6bee7e33 100644 --- a/Program.cs +++ b/Program.cs @@ -1627,6 +1627,7 @@ public static void ImportPsdPropertyTemplate(PropertyDef def, DocProperty docpro } } +#if false internal static void ImportMvdCardinality(DocModelRule docRule, CardinalityType cardinality) { switch (cardinality) @@ -1657,6 +1658,7 @@ internal static void ImportMvdCardinality(DocModelRule docRule, CardinalityType break; } } +#endif internal static DocModelRule ImportMvdRule(AttributeRule mvdRule, Dictionary fixups) { @@ -1664,7 +1666,7 @@ internal static DocModelRule ImportMvdRule(AttributeRule mvdRule, Dictionary mapExchange) + { + DocTemplateItem docItem = new DocTemplateItem(); + docItem.Documentation = rule.Description; + docItem.RuleInstanceID = rule.RuleID; + docItem.RuleParameters = rule.Parameters; + + if (rule.References != null) + { + foreach (Concept con in rule.References) + { + DocTemplateUsage docInner = new DocTemplateUsage(); + docItem.Concepts.Add(docInner); + ImportMvdConcept(con, docInner, docProject, mapExchange); + } + } + + return docItem; + } + private static void ImportMvdTemplate(ConceptTemplate mvdTemplate, DocTemplateDefinition docDef, Dictionary fixups) { ImportMvdObject(mvdTemplate, docDef); @@ -2094,36 +2125,17 @@ private static void ExportMvdConcept(Concept mvdConceptLeaf, DocTemplateUsage do } // rules + mvdConceptLeaf.TemplateRules = new TemplateRules(); + mvdConceptLeaf.TemplateRules.Operator = (TemplateOperator)Enum.Parse(typeof(TemplateOperator), docTemplateUsage.Operator.ToString()); foreach (DocTemplateItem docRule in docTemplateUsage.Items) { - TemplateRule mvdTemplateRule = new TemplateRule(); - mvdConceptLeaf.Rules.Add(mvdTemplateRule); - mvdTemplateRule.RuleID = docRule.RuleInstanceID; - mvdTemplateRule.Description = docRule.Documentation; - mvdTemplateRule.Parameters = docRule.RuleParameters; + TemplateRule mvdTemplateRule = ExportMvdItem(docRule); + mvdConceptLeaf.TemplateRules.TemplateRule.Add(mvdTemplateRule); - // nested concepts - if (docRule.Concepts.Count > 0) - { - mvdConceptLeaf.SubConcepts = new List(); - } - -#if false // using existing MVDXML schema - // nested rules - int index = 0; - foreach(DocTemplateUsage docInner in docRule.Concepts) - { - Concept mvdInner = new Concept(); - mvdConceptLeaf.SubConcepts.Add(mvdInner); - ExportMvdConcept(mvdInner, docInner); - - mvdInner.Code = index.ToString(); // associate concept with specific template item -- VERIFY: should MVDXML schema support? - index++; - } -#endif // using proposed mvdXML schema if (docRule.Concepts.Count > 0) { + mvdConceptLeaf.SubConcepts = new List(); mvdTemplateRule.References = new List(); foreach (DocTemplateUsage docInner in docRule.Concepts) { @@ -2135,6 +2147,15 @@ private static void ExportMvdConcept(Concept mvdConceptLeaf, DocTemplateUsage do } } + internal static TemplateRule ExportMvdItem(DocTemplateItem docRule) + { + TemplateRule mvdTemplateRule = new TemplateRule(); + mvdTemplateRule.RuleID = docRule.RuleInstanceID; + mvdTemplateRule.Description = docRule.Documentation; + mvdTemplateRule.Parameters = docRule.RuleParameters; + return mvdTemplateRule; + } + // each list is optional- if specified then must be followed; if null, then no filter applies (all included) internal static void ExportMvd( mvdXML mvd, @@ -2191,6 +2212,20 @@ internal static void ExportMvd( ExportMvdObject(mvdConceptRoot, docRoot); mvdConceptRoot.ApplicableRootEntity = docRoot.ApplicableEntity.Name; + if (docRoot.ApplicableTemplate != null) + { + mvdConceptRoot.Applicability = new ApplicabilityRules(); + mvdConceptRoot.Applicability.Template = new TemplateRef(); + mvdConceptRoot.Applicability.Template.Ref = docRoot.ApplicableTemplate.Uuid; + mvdConceptRoot.Applicability.TemplateRules = new TemplateRules(); + + mvdConceptRoot.Applicability.TemplateRules.Operator = (TemplateOperator)Enum.Parse(typeof(TemplateOperator), docRoot.ApplicableOperator.ToString()); + foreach (DocTemplateItem docItem in docRoot.ApplicableItems) + { + TemplateRule rule = ExportMvdItem(docItem); + mvdConceptRoot.Applicability.TemplateRules.TemplateRule.Add(rule); + } + } foreach (DocTemplateUsage docTemplateUsage in docRoot.Concepts) { @@ -2285,6 +2320,7 @@ private static void ExportMvdTemplate(ConceptTemplate mvdTemplate, DocTemplateDe } } +#if false private static CardinalityType ExportCardinalityType(DocModelRule rule) { if (rule.CardinalityMin == 0 && rule.CardinalityMax == 0) @@ -2310,13 +2346,14 @@ private static CardinalityType ExportCardinalityType(DocModelRule rule) return CardinalityType._asSchema; } +#endif private static void ExportMvdRule(AttributeRule mvdRule, DocModelRule docRule) { mvdRule.RuleID = docRule.Identification; mvdRule.Description = docRule.Description; mvdRule.AttributeName = docRule.Name; - mvdRule.Cardinality = ExportCardinalityType(docRule); + //mvdRule.Cardinality = ExportCardinalityType(docRule); foreach (DocModelRule docRuleEntity in docRule.Rules) { @@ -2332,7 +2369,7 @@ private static void ExportMvdRule(AttributeRule mvdRule, DocModelRule docRule) mvdRuleEntity.RuleID = docRuleEntity.Identification; mvdRuleEntity.Description = docRuleEntity.Description; mvdRuleEntity.EntityName = docRuleEntity.Name; - mvdRuleEntity.Cardinality = ExportCardinalityType(docRuleEntity); + //mvdRuleEntity.Cardinality = ExportCardinalityType(docRuleEntity); foreach (DocModelRule docRuleAttribute in docRuleEntity.Rules) { @@ -3078,10 +3115,10 @@ internal static void ImportXsdComplex(IfcDoc.Schema.XSD.complexType complex, Doc } } - internal static void ImportXsd(IfcDoc.Schema.XSD.schema schema, DocProject docProject) + internal static DocSchema ImportXsd(IfcDoc.Schema.XSD.schema schema, DocProject docProject) { // use resource-level section - DocSection docSection = docProject.Sections[6]; // domain-specific schemas + DocSection docSection = docProject.Sections[6]; // source schemas DocSchema docSchema = new DocSchema(); docSchema.Name = schema.id;//?? @@ -3113,6 +3150,8 @@ internal static void ImportXsd(IfcDoc.Schema.XSD.schema schema, DocProject docPr ImportXsdComplex(element.complexType, docSchema, docEntity); } + + return docSchema; } } diff --git a/Properties/AssemblyInfo.cs b/Properties/AssemblyInfo.cs index ee15207b..5d589fee 100644 --- a/Properties/AssemblyInfo.cs +++ b/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("8.8.0.0")] -[assembly: AssemblyFileVersion("8.8.0.0")] +[assembly: AssemblyVersion("9.4.0.0")] +[assembly: AssemblyFileVersion("9.4.0.0")] diff --git a/Schema.cs b/Schema.cs index 282a680d..64419b9f 100644 --- a/Schema.cs +++ b/Schema.cs @@ -6,6 +6,7 @@ // Note: This specific file has dual copyright such that both organizations maintain all rights to its use. using System; +using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Reflection; @@ -73,7 +74,8 @@ public abstract class SHeader : SRecord /// /// A context-bound object that can query relationships or pull content dynamically from broker /// - public abstract class SEntity : SRecord + public abstract class SEntity : SRecord, + ICloneable { static Dictionary> s_fieldmap = new Dictionary>(); // cached field lists in declaration order static Dictionary> s_inversemap = new Dictionary>(); @@ -271,6 +273,80 @@ public virtual string GetTypeCaption() // fall back on internal type return this.GetType().Name; } + + + + public object Clone() + { + Type t = this.GetType(); + + // make a copy, attached to broker + SEntity clone = (SEntity)Activator.CreateInstance(t); + + // reference all registered fields + IList fields = SEntity.GetFieldsOrdered(t); + foreach (FieldInfo field in fields) + { + if (field.FieldType.IsValueType || field.FieldType == typeof(string)) + { + // copy over value types + object val = field.GetValue(this); + field.SetValue(clone, val); + } + else if (field.FieldType.IsInterface || typeof(SEntity).IsAssignableFrom(field.FieldType)) + { + // make unique copy of referenced type except for owner history!!! + object val = field.GetValue(this); + if (val is SEntity) + { + SEntity sentity = (SEntity)val; + + SEntity valclone = (SEntity)sentity.Clone(); + field.SetValue(clone, valclone); + } + else + { + field.SetValue(clone, val); + } + } + else if (typeof(IList).IsAssignableFrom(field.FieldType)) + { + IList listSource = (IList)field.GetValue(this); + if (listSource != null) + { + // don't copy collections, but initialize new collection + System.Collections.IList listClone = (System.Collections.IList)Activator.CreateInstance(field.FieldType); + field.SetValue(clone, listClone); + + Type[] genericargs = field.FieldType.GetGenericArguments(); + if (genericargs.Length == 1) + { + foreach (object element in listSource) + { + object elemClone = null; + + // clone resources -- don't carry over rooted objects + if (element is ICloneable) + { + // clone resources, list of list, e.g. IfcBSplineSurface + elemClone = ((ICloneable)element).Clone(); + } + else + { + // i.e. length coordinate + elemClone = element; + } + + // now add to list, INCLUDING IF NULL such as blank entries of table + listClone.Add(elemClone); + } + } + } + } + } + + return clone; + } } diff --git a/SchemaDoc.cs b/SchemaDoc.cs index 807d6806..ae29f924 100644 --- a/SchemaDoc.cs +++ b/SchemaDoc.cs @@ -1112,11 +1112,13 @@ private DocAttribute GetEntityAttribute(DocEntity entity, string attr) private void RegisterRule(Dictionary included, DocEntity docEntity, DocModelRuleAttribute docRuleAttr, Dictionary mapVirtualAttributes) { // cardinality of 0:0 indicates excluded +#if false if (docRuleAttr.CardinalityMin == -1 && docRuleAttr.CardinalityMax == -1) { // excluded } else +#endif { DocAttribute docAttr = GetEntityAttribute(docEntity, docRuleAttr.Name); if (docAttr != null) @@ -1249,49 +1251,45 @@ public void RegisterObjectsInScope(DocModelView docView, Dictionary _XsdFormats; // new in 5.7 + [DataMember(Order = 5)] bool _IncludeAllDefinitions; // new in 8.9: if true, then don't filter out unreferenced entities/attributes + [DataMember(Order = 6)] string _RootEntity; // new in 8.9: indicates root entity of schema, as shown in inheritance diagram private Dictionary m_filtercache; // for performance, remember items within scope of model view; built on demand, cleared whenever there's a change that could impact @@ -2084,6 +2069,30 @@ public List XsdFormats } } + public bool IncludeAllDefinitions + { + get + { + return this._IncludeAllDefinitions; + } + set + { + this._IncludeAllDefinitions = value; + } + } + + public string RootEntity + { + get + { + return this._RootEntity; + } + set + { + this._RootEntity = value; + } + } + public DocConceptRoot GetConceptRoot(Guid guid) { if (this.ConceptRoots != null) @@ -2146,8 +2155,11 @@ public override void Delete() // new in IfcDoc 3.5 -- organizes concepts according to MVD public class DocConceptRoot : DocObject { - [DataMember(Order = 0)] DocEntity _ApplicableEntity; - [DataMember(Order = 1)] List _Concepts; + [DataMember(Order = 0)] private DocEntity _ApplicableEntity; + [DataMember(Order = 1)] private List _Concepts; + [DataMember(Order = 2)] private DocTemplateDefinition _ApplicableTemplate; // V9.3: optional template definition to be used for determining applicability + [DataMember(Order = 3)] private List _ApplicableItems; // V9.3: items used for template definition + [DataMember(Order = 4)] private DocTemplateOperator _ApplicableOperator; // V9.3: operator used for items public DocConceptRoot() { @@ -2174,6 +2186,42 @@ public List Concepts } } + public DocTemplateDefinition ApplicableTemplate + { + get + { + return this._ApplicableTemplate; + } + set + { + this._ApplicableTemplate = value; + } + } + + public List ApplicableItems + { + get + { + if(this._ApplicableItems == null) + { + this._ApplicableItems = new List(); + } + return this._ApplicableItems; + } + } + + public DocTemplateOperator ApplicableOperator + { + get + { + return this._ApplicableOperator; + } + set + { + this._ApplicableOperator = value; + } + } + public override void Delete() { if (this.Concepts != null) @@ -2218,8 +2266,8 @@ public abstract class DocModelRule : SEntity, [DataMember(Order = 2)] public string Identification; // the template parameter ID [DataMember(Order = 3)] public List Rules; // subrules //[DataMember(Order = 4)] public DocModelRuleTypeEnum Type; // deleted in IfcDoc 2.7 - [DataMember(Order = 4)] public int CardinalityMin; // -1 means undefined // added in IfcDoc 3.3 - [DataMember(Order = 5)] public int CardinalityMax; // -1 means unbounded // added in IfcDoc 3.3 + [DataMember(Order = 4), Obsolete] public int CardinalityMin; // -1 means undefined // added in IfcDoc 3.3 ; DEPRECATED + [DataMember(Order = 5), Obsolete] public int CardinalityMax; // -1 means unbounded // added in IfcDoc 3.3 ; DEPRECATED public DocModelRule() { @@ -2254,6 +2302,7 @@ public virtual void BuildParameterList(IList list) } } +#if false public string GetCardinalityExpression() { if (this.CardinalityMin == 0 && this.CardinalityMax == 0) @@ -2275,8 +2324,13 @@ public string GetCardinalityExpression() return " [" + min + ":" + max + "]"; } +#endif + public abstract bool? Validate(object target, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root, DocTemplateUsage docOuterConcept); - public abstract bool? Validate(object target, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root); + public virtual bool IsTemplateReferenced(DocTemplateDefinition docTemplate) + { + return false; + } /// /// Makes deep copy of rule and all child rules @@ -2357,8 +2411,9 @@ public override void BuildParameterList(IList list) /// Map identifiers to compiled types. /// Sequence of rules leading up to this check, used for reporting any failures. /// The root object, used for recording pass/fail status for nested rules. + /// Outer concept, used for recording objects that failed. /// True if passing, False if failing, Null if inapplicable. - private bool? ValidateItem(object value, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root) + private bool? ValidateItem(object value, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root, DocTemplateUsage docOuterConcept) { // (3) if parameter is defined, check for match if (!String.IsNullOrEmpty(this.Identification)) @@ -2372,32 +2427,141 @@ public override void BuildParameterList(IList list) if (docInnerConcept.Items.Count == 0) return true; // no items to check + // V9.0: new behavior: if something isn't listed as a rule, then it fails foreach (DocTemplateItem docInnerItem in docInnerConcept.Items) { - if (!docInnerItem.Optional) + if (docInnerItem.RuleParameters.Contains("Fire")) + { + this.ToString(); + } + + //if (!docInnerItem.Optional) { - bool itemmatch = true; + bool applies = true; + bool alltrue = true; foreach (DocModelRule docInnerRule in docInnerConcept.Definition.Rules) { - bool? innerResult = docInnerRule.Validate(value, docInnerItem, typemap, trace, root); - if (innerResult != null && !innerResult.Value) + // all inner rules must return true for the template item + bool? innerResult = docInnerRule.Validate(value, docInnerItem, typemap, trace, root, docInnerConcept); + if(innerResult != null) { - itemmatch = false; + if(!innerResult.Value) + { + if (value is SEntity) + { + List list = docInnerConcept.GetValidationMismatches(root, docOuterConcept); + list.Add((SEntity)value); + } + + alltrue = false; + break; + } +#if false + if (innerResult.Value) + { + if(docInnerItem.RuleParameters.Contains("Flame")) + { + this.ToString(); + } + + // passes, regardless if optional or required + docInnerItem.ValidationStructure[root] = true; + + if (!docInnerConcept.ValidationStructure.ContainsKey(root)) + { + docInnerConcept.ValidationStructure[root] = true; + + if (docInnerConcept.Validation == null) + { + docInnerConcept.Validation = true; + } + } + itemresult = true; + break; + } + else + { + // fails -- if required +#if true + if (!docInnerItem.ValidationStructure.ContainsKey(root)) + { + docInnerItem.ValidationStructure[root] = false; + if (!docInnerItem.Optional) + { + docInnerConcept.ValidationStructure[root] = false; + docInnerConcept.Validation = false; + itemresult = false; + } + } +#endif + } + //break; +#endif + } + else + { + // doesn't apply -- a conditional parameter didn't match + applies = false; + break; } } - if (itemmatch) + if(applies) { - docInnerItem.ValidationStructure[root] = true; - return true; + if(alltrue) + { + docInnerItem.ValidationStructure[root] = alltrue; + if (!docInnerConcept.ValidationStructure.ContainsKey(root)) + { + docInnerConcept.ValidationStructure[root] = true; + docInnerConcept.Validation = true; + } + return true; + } + else + { + //docInnerConcept.ValidationStructure[root] = false; + //docInnerConcept.Validation = false; + } + } + else + { + } } + } - // nothing matched +#if false + if (itemresult == null || itemresult == false) + { + docInnerConcept.ValidationStructure[root] = false; + docInnerConcept.Validation = false; + return false; + } +#endif + // item found that was unexpected docInnerConcept.ValidationStructure[root] = false; docInnerConcept.Validation = false; + + if (docItem != null) + { + List listMismatch = docInnerConcept.GetValidationMismatches(root, docItem); + listMismatch.Add((SEntity)value); + } + else + { + this.ToString(); + } + return false; + /* + else + { + docInnerConcept.ValidationStructure[root] = true; + docInnerConcept.Validation = true; + + }*/ } else { @@ -2457,6 +2621,12 @@ public override void BuildParameterList(IList list) } else { + if (value is SEntity) + { + List listMismatch = docOuterConcept.GetValidationMismatches(root, docItem); + listMismatch.Add((SEntity)value); + } + // constraint evaluated to false and conditioned applied. return false; } @@ -2479,7 +2649,7 @@ public override void BuildParameterList(IList list) } // attribute rule is true if at least one entity filter matches or one constraint filter matches - bool? result = rule.Validate(value, docItem, typemap, trace, root); + bool? result = rule.Validate(value, docItem, typemap, trace, root, docOuterConcept); if (result != null && result.Value) { return result; @@ -2513,7 +2683,7 @@ public override void BuildParameterList(IList list) /// /// Root object used for associating status of rules at referenced templates /// - public override bool? Validate(object target, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root) + public override bool? Validate(object target, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root, DocTemplateUsage docOuterConcept) { trace.Add(this); @@ -2528,6 +2698,9 @@ public override void BuildParameterList(IList list) // (2) extract the value object value = fieldinfo.GetValue(target); // may be null + if (docItem != null && value == null) + return false; // structure required to exist + if (value is System.Collections.IList) { System.Collections.IList list = (System.Collections.IList)value; @@ -2544,7 +2717,7 @@ public override void BuildParameterList(IList list) trace.RemoveAt(tracelen); } - bool? result = ValidateItem(o, docItem, typemap, trace, root); + bool? result = ValidateItem(o, docItem, typemap, trace, root, docOuterConcept); if (result != null) { if (result.Value) @@ -2553,21 +2726,20 @@ public override void BuildParameterList(IList list) } else { - fail++; } } } bool? checkcard = null; -#if false +#if true if (docItem != null) { - checkcard = (fail == 0); + checkcard = (pass > 0);// (fail == 0); } else #endif - if (this.CardinalityMin == 0 && this.CardinalityMax == 0) // uninitialized; same as schema + //if (this.CardinalityMin == 0 && this.CardinalityMax == 0) // uninitialized; same as schema { if (pass > 0) { @@ -2583,6 +2755,7 @@ public override void BuildParameterList(IList list) } //!!checkcard = (pass > 0);// (fail == 0); } +#if false else if(this.CardinalityMin == -1 && this.CardinalityMax == -1) // restricted (should not be present) (0:0) { checkcard = (pass == 0); @@ -2611,6 +2784,7 @@ public override void BuildParameterList(IList list) { checkcard = true; } +#endif if (checkcard == null || checkcard.Value) { @@ -2625,6 +2799,7 @@ public override void BuildParameterList(IList list) } else { +#if false if (this.CardinalityMin == 1 && value == null) { // must be one @@ -2641,10 +2816,10 @@ public override void BuildParameterList(IList list) trace.Remove(this); return true; } - +#endif // validate single - bool? checkitem = ValidateItem(value, docItem, typemap, trace, root); - if(checkitem == null || checkitem.Value) + bool? checkitem = ValidateItem(value, docItem, typemap, trace, root, docOuterConcept); + if(checkitem == null || !checkitem.Value) { trace.Remove(this); } @@ -2687,6 +2862,11 @@ public List References } } + public override bool IsTemplateReferenced(DocTemplateDefinition docTemplate) + { + return this.References.Contains(docTemplate); + } + /// /// Validates rules for an entity. /// @@ -2694,7 +2874,7 @@ public List References /// Template item to validate. /// Map of type names to type definitions. /// True if passing, False if failing, or null if inapplicable. - public override bool? Validate(object target, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root) + public override bool? Validate(object target, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root, DocTemplateUsage docOuterConcept) { trace.Add(this); @@ -2712,21 +2892,51 @@ public List References if (target is SEntity) { bool canpass = true; // if false, then can only be null (if not applicable due to parameter filtered out), or false (failure) - foreach (DocModelRule rule in this.Rules) - { - bool? result = rule.Validate((SEntity)target, docItem, typemap, trace, root); - // entity rule is inapplicable if any attribute rules are inapplicable - if (result == null) + // first pass: catch any conditional parameters + foreach (DocModelRule rule in this.Rules) + { + if (rule.IsCondition()) { - trace.Remove(this); - return null; + bool? result = rule.Validate((SEntity)target, docItem, typemap, trace, root, docOuterConcept); + + // entity rule is inapplicable if any attribute rules are inapplicable + if (result == null || !result.Value) + { + trace.Remove(this); + return null; + } + +#if false + // entity rule fails if any attribute rules fail + if (!result.Value) + { + return null; + canpass = false; + } +#endif } + } - // entity rule fails if any attribute rules fail - if (!result.Value) + // second pass: catch any non-conditional parameters + foreach (DocModelRule rule in this.Rules) + { + if (!rule.IsCondition()) { - canpass = false; + bool? result = rule.Validate((SEntity)target, docItem, typemap, trace, root, docOuterConcept); + + // entity rule is inapplicable if any attribute rules are inapplicable + if (result == null) + { + trace.Remove(this); + return null; + } + + // entity rule fails if any attribute rules fail + if (!result.Value) + { + canpass = false; + } } } @@ -2748,7 +2958,7 @@ public class DocModelRuleConstraint : DocModelRule { [DataMember(Order = 0)] public DocOpExpression Expression; // new in IfcDoc 6.1 - public override bool? Validate(object target, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root) + public override bool? Validate(object target, DocTemplateItem docItem, Dictionary typemap, List trace, SEntity root, DocTemplateUsage docOuterConcept) { // constraint validation is now done in compiled code -- indicate pass to keep going return true; @@ -3981,6 +4191,17 @@ public enum DocOpCode IsUnique = 0xFF0002, // custom op for uniqueness } + public enum DocTemplateOperator + { + And = 0, // every row must be true + Or = 1, // at least one row must be true + Not = 2, // at least one row must be false + Nand = 3,// reverse of AND: every row must be false + Nor = 4, // reverse of OR: + Xor = 5, // only one row must be true + Nxor = 6,// reverse of XOR: ?? + } + /// /// Concept (usage of a template) /// @@ -3993,10 +4214,12 @@ public class DocTemplateUsage : DocObject // now inherits from DocObject [DataMember(Order = 3)] private bool _Override; // new in 5.0; if true, then any concepts of same template from supertypes are not inherited [DataMember(Order = 4)] private bool _Suppress; // new in 8.2; if true, then concept is disallowed [DataMember(Order = 5)] private List _Concepts; // new in 8.6: nested concepts, where only one is required to pass + [DataMember(Order = 6)] private DocTemplateOperator _Operator; // new in 9.3 private bool? _validation; // unserialized; null: no applicable instances; false: one or more failures; true: all pass private Dictionary _validateStructure; // private Dictionary _validateConstraints; // + private Dictionary>> _validateMismatches; public DocTemplateUsage() { @@ -4023,6 +4246,10 @@ public Dictionary ValidationStructure { get { + if(this.Items.Count == 1 && this.Items[0].RuleParameters.Contains("SandwichWallBehavior")) + { + this.ToString(); + } if(this._validateStructure == null) { this._validateStructure = new Dictionary(); @@ -4043,6 +4270,39 @@ public Dictionary ValidationConstraints } } + /// + /// + /// + /// The root entity being tested + /// outer template item or concept root to qualify + /// + public List GetValidationMismatches(SEntity o, DocObject outer) + { + if (o == null) + return null; + + if (this._validateMismatches == null) + { + this._validateMismatches = new Dictionary>>(); + } + + Dictionary> dictionaryItem = null; + if(!this._validateMismatches.TryGetValue(o, out dictionaryItem)) + { + dictionaryItem = new Dictionary>(); + this._validateMismatches.Add(o, dictionaryItem); + } + + List list = null; + if(!dictionaryItem.TryGetValue(outer, out list)) + { + list = new List(); + dictionaryItem.Add(outer, list); + } + + return list; + } + public override string ToString() { if (this.Definition != null) @@ -4112,6 +4372,18 @@ public bool Suppress } } + public DocTemplateOperator Operator + { + get + { + return this._Operator; + } + set + { + this._Operator = value; + } + } + /// /// Nested concepts, where only one of the concepts is required to pass. /// @@ -4200,11 +4472,17 @@ public void ResetValidation() this.Validation = null; this.ValidationStructure.Clear(); this.ValidationConstraints.Clear(); + this._validateMismatches = null; foreach (DocTemplateItem docItem in this.Items) { docItem.ValidationStructure.Clear(); docItem.ValidationConstraints.Clear(); + + foreach(DocTemplateUsage innerusage in docItem.Concepts) + { + innerusage.ResetValidation(); + } } foreach(DocTemplateUsage docNest in this.Concepts) @@ -4212,6 +4490,92 @@ public void ResetValidation() docNest.ResetValidation(); } } + + /// + /// Returns test result for object + /// + /// + /// + public bool? GetResultForObject(object o) + { + if (o == null) + { + return false; + } + + bool hasstructure = false; + bool structure = false; + hasstructure = ValidationStructure.TryGetValue(o, out structure); + + bool hasconstraint = false; + bool constraint = false; + hasconstraint = ValidationConstraints.TryGetValue(o, out constraint); + + if ((hasstructure && !structure) || (hasconstraint && !constraint)) + return false; + + int total = 0; + int pass = 0; + int fail = 0; + + foreach (DocTemplateItem docItem in this.Items) + { + //if (!docItem.Optional) + { + bool? innerresult = docItem.GetResultForObject(o); + if (innerresult != null) + { + total++; + + if (innerresult.Value) + { + pass++; + } + else + { + if (!docItem.Optional) + { + fail++; + } + } + } + } + } + + bool result = false; + switch(this.Operator) + { + case DocTemplateOperator.And: + result = (pass == total); + break; + + case DocTemplateOperator.Or: + result = (pass >= 1 && total >= 1); + break; + + case DocTemplateOperator.Not: + result = (pass != total); + break; + + case DocTemplateOperator.Nand: + result = (pass != total); + break; + + case DocTemplateOperator.Nor: + result = !(pass >= 1 && total >= 1); + break; + + case DocTemplateOperator.Xor: + result = (pass == 1 && total > 1); + break; + + case DocTemplateOperator.Nxor: + result = !(pass == 1 && total > 1); + break; + } + + return result; + } } public class DocExchangeItem : SEntity @@ -4340,7 +4704,18 @@ public string GetParameterValue(string key) string[] args = parm.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); if (args.Length == 2) { - if (args[0].Equals(key)) + string[] nameparts = args[0].Split(new char[] {'.'}, StringSplitOptions.RemoveEmptyEntries); + string fieldname = null; + if (nameparts.Length == 2) + { + fieldname = nameparts[1]; + } + else + { + fieldname = args[0]; + } + + if (fieldname.Equals(key)) { return args[1]; } @@ -4382,8 +4757,52 @@ public Dictionary ValidationConstraints } return this._validateConstraints; } + } + /// + /// Returns test result for object + /// + /// + /// + public bool? GetResultForObject(object o) + { + //if (this.Optional) + // return null; + + bool hasstructure = false; + bool structure = false; + hasstructure = ValidationStructure.TryGetValue(o, out structure); + + bool hasconstraint = false; + bool constraint = false; + hasconstraint = ValidationConstraints.TryGetValue(o, out constraint); + + if ((hasstructure && !structure) || (hasconstraint && !constraint)) + { + if (this.Optional) + return null; + + return false; + } + + // check nested + bool alltrue = true; + foreach(DocTemplateUsage docUsage in this.Concepts) + { + bool? innerresult = docUsage.GetResultForObject(o); + if (innerresult == null || !innerresult.Value) + alltrue = false; + } + + if (alltrue && hasstructure) + return true; + + if (this.Optional) + return null; + + return false; + } } /// @@ -6187,6 +6606,39 @@ internal DocProperty RegisterProperty(string p) return q; } + + public string GetEntityName() + { + string propclass = "IfcPropertySingleValue"; + switch (this.PropertyType) + { + case DocPropertyTemplateTypeEnum.P_SINGLEVALUE: + propclass = "IfcPropertySingleValue"; + break; + + case DocPropertyTemplateTypeEnum.P_BOUNDEDVALUE: + propclass = "IfcPropertyBoundedValue"; + break; + + case DocPropertyTemplateTypeEnum.P_ENUMERATEDVALUE: + propclass = "IfcPropertyEnumeratedValue"; + break; + + case DocPropertyTemplateTypeEnum.P_LISTVALUE: + propclass = "IfcPropertyListValue"; + break; + + case DocPropertyTemplateTypeEnum.P_TABLEVALUE: + propclass = "IfcPropertyTableValue"; + break; + + case DocPropertyTemplateTypeEnum.P_REFERENCEVALUE: + propclass = "IfcPropertyReferenceValue"; + break; + } + + return propclass; + } } public enum DocPropertyTemplateTypeEnum @@ -6218,6 +6670,17 @@ public List Constants return this._Constants; } } + + internal DocPropertyConstant GetConstant(string p) + { + foreach (DocPropertyConstant docQuantity in this.Constants) + { + if (docQuantity.Name.Equals(p)) + return docQuantity; + } + + return null; + } } // new in IFCDOC 5.8 @@ -6382,6 +6845,31 @@ public DocChangeAction() this._Changes = new List(); } + public DocChangeAction Copy() + { + DocChangeAction clone = new DocChangeAction(); + clone.Name = this.Name; + clone.Documentation = this.Documentation; + clone.Code = this.Code; + clone.Action = this.Action; + clone.ImpactSPF = this.ImpactSPF; + clone.ImpactXML = this.ImpactXML; + + foreach(DocChangeAspect aspect in this.Aspects) + { + DocChangeAspect newaspect = new DocChangeAspect(aspect.Aspect, aspect.OldValue, aspect.NewValue); + clone.Aspects.Add(newaspect); + } + + foreach(DocChangeAction change in this.Changes) + { + DocChangeAction subaction = change.Copy(); + clone.Changes.Add(subaction); + } + + return clone; + } + public override void Delete() { foreach(DocChangeAspect aspect in this.Aspects) diff --git a/SchemaMvd.cs b/SchemaMvd.cs index a5fe821c..3023a699 100644 --- a/SchemaMvd.cs +++ b/SchemaMvd.cs @@ -102,10 +102,11 @@ public class Concept : Element { [DataMember(Order = 0)] public TemplateRef Template; // links to ConceptTemplate [DataMember(Order = 1)] public List Requirements = new List(); - [DataMember(Order = 2)] public List Rules = new List(); + //[DataMember(Order = 2)] public List Rules = new List(); + [DataMember(Order = 2)] public TemplateRules TemplateRules = new TemplateRules(); [DataMember(Order = 3)] public List SubConcepts; // added v3.8 [DataMember(Order = 4), XmlAttribute("override")] public bool Override; // added in v5.6 - [DataMember(Order = 5)] public BaseConcept BaseConcept; + [DataMember(Order = 5), XmlElement("baseConcept")] public BaseConcept BaseConcept; } // used to map xpath @@ -212,8 +213,16 @@ public class ExchangeRequirement : Element [XmlType("ConceptRoot")] public class ConceptRoot : Element { - [DataMember(Order = 0), XmlAttribute("applicableRootEntity")] public string ApplicableRootEntity; // e.g. 'IfcBeam' - [DataMember(Order = 1)] public List Concepts = new List(); // really Concept but fixed according to sample data to get xml serializer working + [DataMember(Order = 0)] public ApplicabilityRules Applicability; + [DataMember(Order = 1), XmlAttribute("applicableRootEntity")] public string ApplicableRootEntity; // e.g. 'IfcBeam' + [DataMember(Order = 2)] public List Concepts = new List(); // really Concept but fixed according to sample data to get xml serializer working + } + + [XmlType("ApplicabilityRules")] + public class ApplicabilityRules : Element + { + [DataMember(Order = 0)] public TemplateRef Template; + [DataMember(Order = 1)] public TemplateRules TemplateRules; } [XmlType("AbstractRule")] @@ -227,9 +236,9 @@ public abstract class AbstractRule : SEntity public class AttributeRule : AbstractRule { [DataMember(Order = 0), XmlAttribute("AttributeName")] public string AttributeName; - [DataMember(Order = 1), XmlAttribute("Cardinality")] public CardinalityType Cardinality; - [DataMember(Order = 2)] public List EntityRules; - [DataMember(Order = 3)] public List Constraints; + //[DataMember(Order = 1), XmlAttribute("Cardinality")] public CardinalityType Cardinality; + [DataMember(Order = 1)] public List EntityRules; + [DataMember(Order = 2)] public List Constraints; } public enum CardinalityType @@ -245,11 +254,10 @@ public enum CardinalityType public class EntityRule : AbstractRule { [DataMember(Order = 0), XmlAttribute("EntityName")] public string EntityName; - [DataMember(Order = 1), XmlAttribute("Cardinality")] public CardinalityType Cardinality; - [DataMember(Order = 2)] public List AttributeRules; - [DataMember(Order = 3)] public List EntityRules; - [DataMember(Order = 4)] public List Constraints; - [DataMember(Order = 5)] public List References; // MVDXML 1.1 -- links to concept templates defined on referenced entity + //[DataMember(Order = 1), XmlAttribute("Cardinality")] public CardinalityType Cardinality; + [DataMember(Order = 1)] public List AttributeRules; + [DataMember(Order = 2)] public List Constraints; + [DataMember(Order = 3)] public List References; // MVDXML 1.1 -- links to concept templates defined on referenced entity } [XmlType("Constraint")] @@ -264,4 +272,23 @@ public class TemplateRule : AbstractRule [DataMember(Order = 0), XmlAttribute("Parameters")] public string Parameters; [DataMember(Order = 1)] public List References; // proposed for mvdxml 1.1 -- not yet approved } + + [XmlType("TemplateRules")] // added in mvdXML 1.1d + public class TemplateRules + { + [DataMember(Order = 0), XmlAttribute("operator")] public TemplateOperator Operator; + [DataMember(Order = 1), XmlElement(typeof(TemplateRule))] public List TemplateRule = new List(); + [DataMember(Order = 2), XmlElement(typeof(TemplateRules))] public TemplateRules InnerRules; + } + + public enum TemplateOperator // added in mvdXML 1.1d + { + [XmlEnum("and")] And = 0, + [XmlEnum("or")] Or = 1, + [XmlEnum("not")] Not = 2, + [XmlEnum("nand")] Nand = 3, + [XmlEnum("nor")] Nor = 4, + [XmlEnum("xor")] Xor = 5, + [XmlEnum("nxor")] Nxor = 6, + } } diff --git a/xsd1.txt b/xsd1.txt index 45d603de..c8f38efa 100644 --- a/xsd1.txt +++ b/xsd1.txt @@ -1,4 +1,4 @@ - +