Get the telecom domain network and network information from the utility network
awaitQueuedTask.Run(()=>{if(!utilityNetwork.HasTelecomNetwork){Console.WriteLine("The utility network does not have a telecom domain network.");}// Get the telecom domain network from the utility network definition.IReadOnlyList<DomainNetwork>domainNetworks=utilityNetwork.GetDefinition().GetDomainNetworks();foreach(DomainNetworkdomainNetworkindomainNetworks){if(domainNetworkisTelecomDomainNetworktdn){// The telecom domain network was found.telecomDomainNetwork=tdn;// Get information about circuit properties from the telecom domain network.CircuitPropertiescircuitProperties=telecomDomainNetwork.CircuitProperties;Console.WriteLine($"Maximum hops in a circuit: {circuitProperties.MaxHops}");Console.WriteLine($"Number of paths in a circuit: {circuitProperties.NumPaths}");// Get the circuit color scheme informationIReadOnlyList<ColorScheme>colorSchemes=telecomDomainNetwork.ColorSchemes;foreach(ColorSchemecolorSchemeincolorSchemes){stringcolorSchemeName=colorScheme.Name;intcolorSchemeID=colorScheme.ID;IReadOnlyList<ColorSchemeGroup>colorSchemeGroups=colorScheme.Groups;foreach(ColorSchemeGroupgroupincolorSchemeGroups){Console.WriteLine($"Color Scheme: {colorSchemeName}, Group: {group.Name}");// Color codesIReadOnlyList<ColorCode>colorCodes=group.ColorCodes;foreach(ColorCodecolorCodeincolorCodes){Console.WriteLine($"Color Code: {colorCode}");}// CapacitiesIReadOnlyList<int>capacities=group.Capacity;foreach(intcapacityincapacities){Console.WriteLine($"Capacity: {capacity}");}}}// Use the telecom domain network to get additional information about the network.IReadOnlyList<WavelengthScheme>wavelengthSchemes=telecomDomainNetwork.WavelengthSchemes;IReadOnlyList<DividePolicy>dividePolicies=telecomDomainNetwork.DividePolicies;IReadOnlyList<CombinePolicy>combinePolicies=telecomDomainNetwork.CombinePolicies;IReadOnlyList<string>diagramTemplateNames=telecomDomainNetwork.DiagramTemplateNames;}}});
Create a Telecom Element and Circuit Location in the utility network
awaitQueuedTask.Run(()=>{using(NetworkSourcenetworkSource=telecomDomainNetwork.NetworkSources.FirstOrDefault(ns =>ns.Name.Contains(assetGroupName)))using(AssetGroupassetGroup=networkSource.GetAssetGroup(assetTypeName))using(AssetTypeassetType=assetGroup.GetAssetType(assetTypeName)){if(assetType==null){thrownewException($"Asset type '{assetTypeName}' not found in group '{assetGroupName}'.");}TelecomElementtelecomElement=utilityNetwork.CreateElement(assetType,globalID)asTelecomElement;// Use the telecom element to create a circuit location.CircuitLocationcircuitLocation=newCircuitLocation(telecomElement);}});
Create a physical circuit (non-sectioned) in the utility network with subcircuits
awaitQueuedTask.Run(()=>{using(CircuitManagercircuitManager=utilityNetwork.GetCircuitManager(telecomDomainNetwork)){// Create a non-sectioned circuit objectCircuitcircuit=newCircuit(circuitManager);circuit.SetName(circuitNames.First());circuit.SetSectioned(false);circuit.SetCircuitType(CircuitType.Physical);// Set a circuit user attributeIReadOnlyList<Field>circuitFields=circuitManager.GetCircuitUserFields();circuit[circuitFields.First().Name]="My circuit description";// Add start and stop locationscircuit.SetStartLocation(newCircuitLocation(startElement));circuit.SetStopLocation(newCircuitLocation(stopElement));Subcircuitsubcircuit1=newSubcircuit(circuitManager);subcircuit1.SetName("Subcircuit1");// Set a subcircuit user attributeIReadOnlyList<Field>subcircuitFields=circuitManager.GetSubcircuitUserFields();subcircuit1[subcircuitFields[0].Name]="My subcircuit description";Subcircuitsubcircuit2=newSubcircuit(circuitManager);subcircuit2.SetName("Subcircuit2");subcircuit2.SetProviderID(newGuid("9B587BB4-FA30-4AC8-ACAC-4CB1BB087111"));// Example GUID // Add subcircuits to the circuitcircuit.SetSubcircuits(newList<Subcircuit>{subcircuit1,subcircuit2});// Create the circuit.circuitManager.Create(circuit);}});
Create a virtual sectioned circuit in the utility network
awaitQueuedTask.Run(()=>{using(CircuitManagercircuitManager=utilityNetwork.GetCircuitManager(telecomDomainNetwork)){// Create a sectioned virtual circuit objectCircuitcircuit=newCircuit(circuitManager);circuit.SetName(circuitNames.First());circuit.SetSectioned(true);circuit.SetCircuitType(CircuitType.Virtual);CircuitSectioncircuitSection1=newCircuitSection(circuitManager);circuitSection1.SetSectionType(CircuitSectionType.Virtual);circuitSection1.SetStartLocation(newCircuitLocation(startElement));circuitSection1.SetStopLocation(newCircuitLocation(stopElement));CircuitSectioncircuitSection2=newCircuitSection(circuitManager);circuitSection2.SetSectionType(CircuitSectionType.Physical);circuitSection2.SetStartLocation(newCircuitLocation(startElement));circuitSection2.SetStopLocation(newCircuitLocation(stopElement));// Add sections in parallelDictionary<CircuitSection,List<CircuitSection>>circuitSections=newDictionary<CircuitSection,List<CircuitSection>>{{circuitSection1,newList<CircuitSection>()},{circuitSection2,newList<CircuitSection>()}};circuit.SetCircuitSections(circuitSections);// Create the circuit.circuitManager.Create(circuit);}});
Alter an existing circuit in the utility network
awaitQueuedTask.Run(()=>{using(CircuitManagercircuitManager=utilityNetwork.GetCircuitManager(telecomDomainNetwork)){// Get the existing circuitCircuitcircuit=circuitManager.GetCircuits(newCircuitFilter(["circuitName"])).First();// Update circuit namecircuit.SetName(circuitNames.First());// Update start and stop locationscircuit.SetStartLocation(newCircuitLocation(startElement));circuit.SetStopLocation(newCircuitLocation(stopElement));// Clear existing subcircuitscircuit.SetSubcircuits(newList<Subcircuit>());// Apply the changescircuitManager.Alter(circuit);}});
Delete circuits from the telecom domain network
awaitQueuedTask.Run(()=>{using(CircuitManagercircuitManager=utilityNetwork.GetCircuitManager(telecomDomainNetwork)){// Delete circuits by namecircuitManager.Delete(circuitNames);}});
Get all circuits at a specific location within the utility network
awaitQueuedTask.Run(()=>{using(CircuitManagercircuitManager=utilityNetwork.GetCircuitManager(telecomDomainNetwork)){// Define a location in the utility network.CircuitLocationlocation=newCircuitLocation(startElement);// Get circuit names from the start locationCircuitFiltercircuitFilter=newCircuitFilter([location],CircuitLocationTypeFilter.All){Hierarchy=CircuitHierarchy.ConsumersAndProviders};IReadOnlyList<string>circuitNames=circuitManager.GetCircuitNames(circuitFilter);// Get circuits from the start locationIReadOnlyList<Circuit>circuits=circuitManager.GetCircuits(circuitFilter);// Get circuits by namescircuitFilter=newCircuitFilter(circuitNames);circuits=circuitManager.GetCircuits(circuitFilter);// Iterate through the circuits.foreach(Circuitcircuitincircuits){Console.WriteLine($"Circuit name: {circuit.GetName()}");}}});
Verify a circuit to check for inconsistencies in the utility network
awaitQueuedTask.Run(()=>{using(CircuitManagercircuitManager=utilityNetwork.GetCircuitManager(telecomDomainNetwork)){IReadOnlyList<CircuitVerifyResult>circuitVerifyResults=circuitManager.Verify(circuitNames,newCircuitVerifyOptions(){SynthesizeGeometries=true});// Iterate through the circuit verification resultsforeach(CircuitVerifyResultcircuitVerifyResultincircuitVerifyResults){Console.WriteLine($"Circuit Name: {circuitVerifyResult.Name}, Geometry: {circuitVerifyResult.Geometry.ToJson()}, "+$"HasError: {circuitVerifyResult.HasError}, Message: {circuitVerifyResult.Message}");}}});
Query the contents of equipment containers in the utility network
awaitQueuedTask.Run(()=>{using(UnitIdentifierManagerunitIdentifierManager=utilityNetwork.GetUnitIdentifierManager()){varnetworkSource=utilityNetwork.GetDefinition().GetNetworkSource("TelecomDevice");// Container to query.UnitIdentifiercontainerUnitId=newUnitIdentifier(networkSource,globalID);// Query the unit identifiers in the containerIReadOnlyList<UnitQueryResult>unitQueryResults=unitIdentifierManager.Query(newList<UnitIdentifier>{containerUnitId});// Iterate through the query resultsforeach(UnitQueryResultunitQueryResultinunitQueryResults){UnitIdentifierunitIdentifier=unitQueryResult.Container;IReadOnlyList<UnitRange>unitsInAContainer=unitQueryResult.UnitRanges;// Iterate through the unit ranges (contents) in the containerforeach(UnitRangeunitRangeinunitsInAContainer){UnitIdentifiercontentUnitId=unitRange.Content;boolisContentGap=unitRange.IsGap;// True if the content is a gap (empty space reserved for installing a larger piece of equipment).short?firstUnit=unitRange.FirstUnit;short?lastUnit=unitRange.LastUnit;}}}});
Reserve a gap in an equipment container in the utility network
awaitQueuedTask.Run(()=>{using(UnitIdentifierManagerunitIdentifierManager=utilityNetwork.GetUnitIdentifierManager()){varnetworkSource=utilityNetwork.GetDefinition().GetNetworkSource("TelecomDevice");UnitIdentifiercontainerUnitIdentifier=newUnitIdentifier(networkSource,globalID);// Reserve a gap in the container for units 2 through 5.unitIdentifierManager.ReserveUnitIDs(containerUnitIdentifier,2,5);}});
Reset the contents of a container in the utility network to remove gaps and make the unit space contiguous
awaitQueuedTask.Run(()=>{using(UnitIdentifierManagerunitIdentifierManager=utilityNetwork.GetUnitIdentifierManager()){varnetworkSource=utilityNetwork.GetDefinition().GetNetworkSource("TelecomDevice");UnitIdentifiercontainerUnitIdentifier=newUnitIdentifier(networkSource,globalID);// Reset the container to remove all gaps and make the unit space contiguous.unitIdentifierManager.Reset(new[]{containerUnitIdentifier});}});
Resize the content of a container in the utility network
awaitQueuedTask.Run(()=>{using(UnitIdentifierManagerunitIdentifierManager=utilityNetwork.GetUnitIdentifierManager()){varnetworkSource=utilityNetwork.GetDefinition().GetNetworkSource("TelecomDevice");UnitIdentifiercontent=newUnitIdentifier(networkSource,globalID);// Update the number of units in an equipment container.unitIdentifierManager.Resize(content,5);}});
Run a path trace in the telecom domain network
awaitQueuedTask.Run(()=>{using(TraceManagertraceManager=utilityNetwork.GetTraceManager())using(NetworkSourcedeviceNetworkSource=telecomDomainNetwork.NetworkSources.First(f =>f.Name.Contains("TelecomDevice")))using(AssetGroupassetGroup=deviceNetworkSource.GetAssetGroup("Port"))using(AssetTypeassetType=assetGroup.GetAssetType("Port")){GuidstartGuid=newGuid("4BB4560A-34F3-4BBA-93D5-C5D6B26F2709");GuidstopGuid=newGuid("32203C76-E484-473A-AEA5-B1AB92A0C198");TelecomElementstartElement=utilityNetwork.CreateElement(assetType,startGuid)asTelecomElement;TelecomElementstopElement=utilityNetwork.CreateElement(assetType,stopGuid)asTelecomElement;List<TelecomElement>startingLocations=newList<TelecomElement>(){startElement};List<TelecomElement>stoppingLocations=newList<TelecomElement>(){stopElement};TraceConfigurationtraceConfiguration=newTraceConfiguration(){MaxHops=100,NumPaths=2,DomainNetwork=telecomDomainNetwork,ValidateConsistency=true};TraceArgumenttraceArgument=newTraceArgument(startingLocations){StoppingLocations=stoppingLocations,Configuration=traceConfiguration,ResultTypes=newList<ResultType>(){ResultType.Path},ResultOptions=newResultOptions{IncludeGeometry=true}};PathTracerpathTracer=traceManager.GetTracer<PathTracer>();IReadOnlyList<Result>results=pathTracer.Trace(traceArgument,ServiceSynchronizationType.Asynchronous);// Iterate through the path trace resultsforeach(Resultresultinresults){if(resultisPathResultpathResult){IReadOnlyList<TracePath>paths=pathResult.Paths;foreach(TracePathpathinpaths){ElementstartLocation=path.StartLocation;ElementstopLocation=path.StopLocation;GeometrypathGeometry=path.Geometry;IReadOnlyList<PathConnectivity>pathConnectivities=path.PathConnectivities;foreach(PathConnectivitypathConnectivityinpathConnectivities){Console.WriteLine($"Edge: {pathConnectivity.Edge.GlobalID}, Junction: {pathConnectivity.Junction.GlobalID}");}}}else{Console.WriteLine("Unexpected result type.");}}}});
Run a circuit trace in the telecom domain network
awaitQueuedTask.Run(()=>{using(TraceManagertraceManager=utilityNetwork.GetTraceManager())using(CircuitManagercircuitManager=utilityNetwork.GetCircuitManager(telecomDomainNetwork)){CircuitcircuitToTrace=circuitManager.GetCircuits(newCircuitFilter(circuitNames)).FirstOrDefault();TraceConfigurationtraceConfiguration=newTraceConfiguration(){MaxHops=10,NumPaths=5,DomainNetwork=telecomDomainNetwork,InferConnectivity=true};TraceArgumenttraceArgument=newTraceArgument(circuitToTrace){Configuration=traceConfiguration,ResultTypes=newList<ResultType>{ResultType.Circuit},ResultOptions=newResultOptions(){IncludeGeometry=true}};CircuitTracercircuitTracer=traceManager.GetTracer<CircuitTracer>();IReadOnlyList<Result>results=circuitTracer.Trace(traceArgument);// Iterate through the circuit trace resultsforeach(Resultresultinresults){if(resultisCircuitResultcircuitResult){IReadOnlyList<CircuitPath>circuitPaths=circuitResult.CircuitPaths;foreach(CircuitPathcircuitPathincircuitPaths){Circuitcircuit=circuitPath.Circuit;TracePathpath=circuitPath.Path;IReadOnlyList<PathConnectivity>pathConnectivities=path.PathConnectivities;foreach(PathConnectivitypathConnectivityinpathConnectivities){Console.WriteLine($"Edge: {pathConnectivity.Edge.GlobalID}, Junction: {pathConnectivity.Junction.GlobalID}");}Geometrygeometry=circuitPath.Geometry;IReadOnlyDictionary<int,TracePath>sectionPaths=circuitPath.SectionPaths;foreach(KeyValuePair<int,TracePath>sectionPathinsectionPaths){intsectionID=sectionPath.Key;TracePathsectionGeometry=sectionPath.Value;Console.WriteLine($"Section ID: {sectionID}, Section Geometry: {sectionGeometry.Geometry.ToJson()}");}}}else{Console.WriteLine("Unexpected result type.");}}}});
Add or delete an association between Telecom elements in the utility network
awaitQueuedTask.Run(()=>{using(NetworkSourcejunctionNetworkSource=telecomDomainNetwork.NetworkSources.FirstOrDefault(ns =>ns.Name.Contains("TelcoDevice")))using(NetworkSourceedgeNetworkSource=telecomDomainNetwork.NetworkSources.FirstOrDefault(ns =>ns.Name.Contains("TelcoEdgeObject"))){TelecomElementjunction=utilityNetwork.CreateElement(junctionNetworkSource.GetAssetGroup("Fiber").GetAssetType("Fiber"),newGuid("CCFCF5DE-5B90-4FD9-A459-2F2E88107532"))asTelecomElement;TelecomElementedgeObject=utilityNetwork.CreateElement(edgeNetworkSource.GetAssetGroup("Fiber").GetAssetType("Fiber"),newGuid("838B4A2B-8531-499D-8DCF-8567901D43D9"))asTelecomElement;Associationassociation=newAssociation(AssociationType.JunctionEdgeObjectConnectivityMidspan,junction,edgeObject,0.3);// Create the association from the port to the fiber.geodatabase.ApplyEdits(()=>{utilityNetwork.AddAssociation(association);});// Delete the associationgeodatabase.ApplyEdits(()=>{utilityNetwork.DeleteAssociation(association);});}});