private IGeometry BuildLinkGeometry(ISchematicInMemoryFeatureLink schLink1, ISchematicInMemoryFeatureNode schNodeToReduce, ISchematicInMemoryFeatureLink schLink2, ISchematicRulesHelper rulesHelper) { if (schLink1 == null || schLink2 == null || schNodeToReduce == null || rulesHelper == null) { return(null); } if (m_keepVertices == false) { return(null); // no geometry } Polyline newPoly = new Polyline(); IPolyline polyLink1 = rulesHelper.GetLinkPoints(schLink1, (schLink1.FromNode == schNodeToReduce)); IPolyline polyLink2 = rulesHelper.GetLinkPoints(schLink2, (schLink2.ToNode == schNodeToReduce)); IPoint nodePt = rulesHelper.GetNodePoint(schNodeToReduce); IPoint Pt; IPointCollection newPts = (IPointCollection)newPoly; IPointCollection link1Pts = (IPointCollection)polyLink1; IPointCollection link2Pts = (IPointCollection)polyLink2; int Count = link1Pts.PointCount; int i; for (i = 0; i < Count - 1; i++) { Pt = link1Pts.get_Point(i); newPts.AddPoint(Pt); } newPts.AddPoint(nodePt); Count = link2Pts.PointCount; for (i = 1; i < Count; i++) { Pt = link2Pts.get_Point(i); newPts.AddPoint(Pt); } IGeometry buildGeometry = (IGeometry)newPoly; return(buildGeometry); }
public void Apply(ISchematicInMemoryDiagram inMemoryDiagram, ESRI.ArcGIS.esriSystem.ITrackCancel cancelTracker) { if (m_reductionLinkName == "") { return; } IEnumSchematicInMemoryFeature enumSchematicElement; ISchematicInMemoryFeature schemElement; ISchematicDiagramClass diagramClass = null; ISchematicElementClass elementClass; IEnumSchematicElementClass enumElementClass; Microsoft.VisualBasic.Collection allreadyUsed = new Microsoft.VisualBasic.Collection(); try { diagramClass = inMemoryDiagram.SchematicDiagramClass; } catch { } if (diagramClass == null) { return; } enumElementClass = diagramClass.AssociatedSchematicElementClasses; enumElementClass.Reset(); elementClass = enumElementClass.Next(); while (elementClass != null) { if (elementClass.Name == m_reductionLinkName) { break; } elementClass = enumElementClass.Next(); } if (elementClass == null) { return; } // Get all link from selected class enumSchematicElement = inMemoryDiagram.GetSchematicInMemoryFeaturesByClass(elementClass); enumSchematicElement.Reset(); ISchematicInMemoryFeatureLink link = null; ISchematicInMemoryFeatureNode fromNode = null; ISchematicInMemoryFeatureNode toNode = null; int iFromPort = 0; int iToPort = 0; ISchematicInMemoryFeature newElem = null; IEnumSchematicInMemoryFeatureLink enumIncidentLinks; ISchematicInMemoryFeatureLinkerEdit schemLinker = (ISchematicInMemoryFeatureLinkerEdit)(new SchematicLinkerClass()); bool bReduction = false; schemElement = enumSchematicElement.Next(); while (schemElement != null) { try { string elemName = allreadyUsed[schemElement.Name].ToString(); // if found, this link is allready used schemElement = enumSchematicElement.Next(); continue; } catch { // Add link to collection allreadyUsed.Add(schemElement.Name, schemElement.Name, null, null); } // Get from node and to node link = (ISchematicInMemoryFeatureLink)schemElement; fromNode = link.FromNode; toNode = link.ToNode; if (m_usePort) { iFromPort = link.FromPort; iToPort = link.ToPort; } // Get all links from this node enumIncidentLinks = fromNode.GetIncidentLinks(esriSchematicEndPointType.esriSchematicOriginOrExtremityNode); enumIncidentLinks.Reset(); newElem = enumIncidentLinks.Next(); while (newElem != null) { bReduction = false; if (newElem == schemElement) { // the new link is the same link we works on newElem = enumIncidentLinks.Next(); continue; } link = (ISchematicInMemoryFeatureLink)newElem; // 1st case of comparison if (fromNode == link.FromNode && toNode == link.ToNode) { if (m_usePort) { bReduction = (iFromPort == link.FromPort && iToPort == link.ToPort); } else { bReduction = true; } } // 2nd case of comparison else if (fromNode == link.ToNode && toNode == link.FromNode) { if (m_usePort) { bReduction = (iFromPort == link.ToPort && iToPort == link.FromPort); } else { bReduction = true; } } if (bReduction) { try { schemLinker.ReportAssociations(newElem, schemElement); // Reports asssociation to first link allreadyUsed.Add(newElem.Name, newElem.Name, null, null); // Add link to collection newElem.Displayed = false; // this link is not visible } catch { } } newElem = enumIncidentLinks.Next(); } schemElement.Displayed = true; schemElement = enumSchematicElement.Next(); } }
public void Apply(ISchematicInMemoryDiagram inMemoryDiagram, ESRI.ArcGIS.esriSystem.ITrackCancel cancelTracker) { ISchematicRulesHelper rulesHelper = new SchematicRulesHelperClass(); System.Collections.Generic.Dictionary <string, ISchematicInMemoryFeature> colSchfeatureNode = new Dictionary <string, ISchematicInMemoryFeature>(); rulesHelper.InitHelper(inMemoryDiagram); rulesHelper.KeepVertices = true; ISchematicDiagramClass diagramClass = null; ISchematicElementClass elementClass; ISchematicElementClass elementClassParentNode = null; IEnumSchematicElementClass enumSchEltCls; try { diagramClass = inMemoryDiagram.SchematicDiagramClass; } catch { } if (diagramClass == null) { return; } enumSchEltCls = diagramClass.AssociatedSchematicElementClasses; if (enumSchEltCls.Count == 0) { return; } enumSchEltCls.Reset(); elementClass = enumSchEltCls.Next(); while (elementClass != null) { if (elementClass.Name == m_parentNodeClassName) { elementClassParentNode = elementClass; m_parentNodeClass = GetSchematicInMemoryFeatureClass(inMemoryDiagram, elementClass); } if (elementClass.Name == m_targetNodeClassName) { m_targetNodeClass = GetSchematicInMemoryFeatureClass(inMemoryDiagram, elementClass); } if (elementClass.Name == m_targetLinkClassName) { m_targetLinkClass = GetSchematicInMemoryFeatureClass(inMemoryDiagram, elementClass); } elementClass = enumSchEltCls.Next(); } if (m_parentNodeClass == null || m_targetNodeClass == null || m_targetLinkClass == null) { return; } IEnumSchematicInMemoryFeature enumSchematicInMemoryFeature; // list nodes degree two // get all feature of parent node class enumSchematicInMemoryFeature = inMemoryDiagram.GetSchematicInMemoryFeaturesByClass(elementClassParentNode); enumSchematicInMemoryFeature.Reset(); // add the node into collection if it contains only 2 links displayed. AddNodesDegreeTwo(enumSchematicInMemoryFeature, colSchfeatureNode, rulesHelper); ISchematicInMemoryFeature schFeatureParent; foreach (KeyValuePair <string, ISchematicInMemoryFeature> kvp in colSchfeatureNode) { schFeatureParent = colSchfeatureNode[kvp.Key]; if (schFeatureParent == null) { continue; } // get 2 links connected of eache feature node IEnumSchematicInMemoryFeature enumLinks = rulesHelper.GetDisplayedIncidentLinks((ISchematicInMemoryFeatureNode)schFeatureParent, esriSchematicEndPointType.esriSchematicOriginOrExtremityNode); // enumLinks surely not null and it contain 2 links displayed double angle1, angle2, angleBisector; bool first = true; angle1 = angle2 = angleBisector = 0; IPoint pointParent = null; ISchematicInMemoryFeatureNodeGeometry geoParent; geoParent = (ISchematicInMemoryFeatureNodeGeometry)schFeatureParent; pointParent = geoParent.InitialPosition; IPoint pointSon = null; bool enableCalculate = true; ISchematicInMemoryFeature schInMemoryFeature = enumLinks.Next(); ISchematicInMemoryFeatureLink schInMemoryLink = (ISchematicInMemoryFeatureLink)schInMemoryFeature; while (schInMemoryLink != null) { ISchematicInMemoryFeatureNodeGeometry nodeGeo; // get angle of 2 links connected if (schInMemoryLink.FromNode.Name == schFeatureParent.Name) { nodeGeo = (ISchematicInMemoryFeatureNodeGeometry)schInMemoryLink.ToNode; } else { nodeGeo = (ISchematicInMemoryFeatureNodeGeometry)schInMemoryLink.FromNode; } if (nodeGeo == null) { enableCalculate = false; break; } pointSon = nodeGeo.InitialPosition; if (first) { angle1 = CalculateAngle(pointParent, pointSon); first = false; } else { angle2 = CalculateAngle(pointParent, pointSon); } schInMemoryFeature = enumLinks.Next(); schInMemoryLink = (ISchematicInMemoryFeatureLink)schInMemoryFeature; } // caculate angle bisector if (enableCalculate) { angleBisector = CalculateAngleBisector(angle1, angle2); } else { continue; } // construct a geometry for the new node node // now call alterNode to create a new schematic feature // construct a correct name string uniqueNodeName, featureCreateName; featureCreateName = schFeatureParent.Name + Separator + extensionName; esriSchematicElementType elementType = esriSchematicElementType.esriSchematicNodeType; uniqueNodeName = GetUniqueName(inMemoryDiagram, elementType, featureCreateName); IWorkspace workspace = null; try { workspace = inMemoryDiagram.SchematicDiagramClass.SchematicDataset.SchematicWorkspace.Workspace; } catch { } int datasourceID = -1; if (workspace != null) { datasourceID = rulesHelper.FindDataSourceID(workspace, false); } if (datasourceID == -1) { datasourceID = m_diagramClass.SchematicDataset.DefaultSchematicDataSource.ID; } ISchematicInMemoryFeature schFeatureNodeCreate = null; IPoint pointBisector = null; pointBisector = GetCoordPointBisector(pointParent, angleBisector, m_distance); try { schFeatureNodeCreate = rulesHelper.AlterNode(m_targetNodeClass, uniqueNodeName, null, (IGeometry)pointBisector, datasourceID, 0); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message, "Impossible to create a feature Node"); } // now construct a unique link name string linkName = schFeatureParent.Name + Separator + uniqueNodeName; string uniqueLinkName; elementType = esriSchematicElementType.esriSchematicLinkType; uniqueLinkName = GetUniqueName(inMemoryDiagram, elementType, linkName); // construct a link ISchematicInMemoryFeature schFeatureLinkCreate = null; try { schFeatureLinkCreate = rulesHelper.AlterLink(m_targetLinkClass, uniqueLinkName, null, null, datasourceID, 0, schFeatureParent.Name, uniqueNodeName, esriFlowDirection.esriFDWithFlow, 0, 0); } catch (Exception ex) { System.Diagnostics.Trace.WriteLine(ex.Message, "Impossible to create a feature link"); } } if (colSchfeatureNode.Count > 0) { colSchfeatureNode.Clear(); } colSchfeatureNode = null; rulesHelper = null; }
private void ReduceNode(ISchematicRulesHelper rulesHelper, ISchematicInMemoryFeatureClass superspanLinkClass, ISpatialReference spatialRef, ISchematicInMemoryFeature schFeatureToReduce) { if (schFeatureToReduce.Displayed == false || rulesHelper == null || spatialRef == null) { return; } // get the two connected links IEnumSchematicInMemoryFeature enumLink = rulesHelper.GetDisplayedIncidentLinks((ISchematicInMemoryFeatureNode)schFeatureToReduce, esriSchematicEndPointType.esriSchematicOriginOrExtremityNode); if (enumLink == null || enumLink.Count != 2) { return; } enumLink.Reset(); ISchematicInMemoryFeature schFeat1 = enumLink.Next(); ISchematicInMemoryFeature schFeat2 = enumLink.Next(); ISchematicInMemoryFeatureLink schLink1 = (ISchematicInMemoryFeatureLink)schFeat1; ISchematicInMemoryFeatureLink schLink2 = (ISchematicInMemoryFeatureLink)schFeat2; if (schLink1 == null || schLink2 == null) { return; } ISchematicInMemoryFeature schFeatureSuperspan = null; ISchematicInMemoryFeature schFeatureTmp = null; ISchematicInMemoryFeatureNode schNodeToReduce = (ISchematicInMemoryFeatureNode)schFeatureToReduce; ISchematicInMemoryFeatureNode schFromNode; ISchematicInMemoryFeatureNode schToNode; int iFromPort; int iToPort; IGeometry superspanGeometry; if (schLink2.FromNode == schNodeToReduce) { superspanGeometry = BuildLinkGeometry(schLink1, schNodeToReduce, schLink2, rulesHelper); if (schLink1.ToNode == schNodeToReduce) { schFromNode = schLink1.FromNode; iFromPort = schLink1.FromPort; } else { schFromNode = schLink1.ToNode; iFromPort = schLink1.ToPort; } schToNode = schLink2.ToNode; iToPort = schLink2.ToPort; } else { superspanGeometry = BuildLinkGeometry(schLink2, schNodeToReduce, schLink1, rulesHelper); schFromNode = schLink2.FromNode; iFromPort = schLink2.FromPort; if (schLink1.FromNode == schNodeToReduce) { schToNode = schLink1.ToNode; iToPort = schLink1.ToPort; } else { schToNode = schLink1.FromNode; iToPort = schLink1.FromPort; } } if (superspanGeometry != null) { superspanGeometry.SpatialReference = spatialRef; } // find a unique name for the superspan string strFromName = schFromNode.Name; string strtoName = schToNode.Name; string strName; long lCount = 1; while (schFeatureSuperspan == null) { strName = strFromName + ";" + strtoName + ";" + lCount.ToString(); if (strName.Length >= 128) { break; // too long a name } try { schFeatureTmp = rulesHelper.AlterLink(superspanLinkClass, strName, null, superspanGeometry, -2, -2, strFromName, strtoName, esriFlowDirection.esriFDWithFlow, iFromPort, iToPort); } catch { schFeatureTmp = null; } if (schFeatureTmp == null) { continue; } // valid new feature schFeatureSuperspan = schFeatureTmp; } // last chance for a unique name lCount = 1; while (schFeatureSuperspan == null) { strName = schNodeToReduce.Name + ";" + lCount.ToString(); if (strName.Length >= 128) { break; // too long a name } try { schFeatureTmp = rulesHelper.AlterLink(superspanLinkClass, strName, null, superspanGeometry, -2, -2, strFromName, strtoName, esriFlowDirection.esriFDWithFlow, iFromPort, iToPort); } catch { schFeatureTmp = null; } if (schFeatureTmp == null) { continue; } // valid new feature schFeatureSuperspan = schFeatureTmp; } if (schFeatureSuperspan == null) { return; // cannot find a unique name } // otherwise report the cumulated length of the reduced links to the superspan ReportCumulativeValues(schFeat1, schFeat2, schFeatureSuperspan); // report the associations on the superspan link rulesHelper.ReportAssociations(schFeatureToReduce, schFeatureSuperspan); rulesHelper.ReportAssociations(schFeat1, schFeatureSuperspan); rulesHelper.ReportAssociations(schFeat2, schFeatureSuperspan); // hide the reduced objects rulesHelper.HideFeature(schFeatureToReduce); rulesHelper.HideFeature(schFeat1); rulesHelper.HideFeature(schFeat2); }
private IGeometry BuildLinkGeometry(ISchematicInMemoryFeatureLink schLink1, ISchematicInMemoryFeatureNode schNodeToReduce, ISchematicInMemoryFeatureLink schLink2, ISchematicRulesHelper rulesHelper) { if (schLink1 == null || schLink2 == null || schNodeToReduce == null || rulesHelper == null) return null; if (m_keepVertices == false) return null; // no geometry Polyline newPoly = new Polyline(); IPolyline polyLink1 = rulesHelper.GetLinkPoints(schLink1, (schLink1.FromNode == schNodeToReduce)); IPolyline polyLink2 = rulesHelper.GetLinkPoints(schLink2, (schLink2.ToNode == schNodeToReduce)); IPoint nodePt = rulesHelper.GetNodePoint(schNodeToReduce); IPoint Pt; IPointCollection newPts = (IPointCollection)newPoly; IPointCollection link1Pts = (IPointCollection)polyLink1; IPointCollection link2Pts = (IPointCollection)polyLink2; int Count = link1Pts.PointCount; int i; for (i = 0; i < Count - 1; i++) { Pt = link1Pts.get_Point(i); newPts.AddPoint(Pt); } newPts.AddPoint(nodePt); Count = link2Pts.PointCount; for (i = 1; i < Count; i++) { Pt = link2Pts.get_Point(i); newPts.AddPoint(Pt); } IGeometry buildGeometry = (IGeometry)newPoly; return buildGeometry; }