// check a numberic field for decimals private void btnDecimalsCheck_Click(object sender, EventArgs e) { try { if (cboCheckDecimals.SelectedIndex == -1) { MessageBox.Show("You must select a field to check.", "Select Field", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } // show the cursor as busy System.Windows.Forms.Cursor.Current = Cursors.WaitCursor; // query for layer's specified field looking for decimals IQueryFilter arcQFilter = new QueryFilter(); arcQFilter.WhereClause = ""; // strActiveComboBox + " not like '%.0000%'"; ITable arcTable = (ITable)clsGlobals.arcFeatLayer; IDataset arcDataset = (IDataset)clsGlobals.arcFeatLayer; if (arcDataset.Workspace.WorkspaceFactory.WorkspaceType == esriWorkspaceType.esriLocalDatabaseWorkspace) { // fgdb MessageBox.Show("This function has not been coded to work on a file geodatabase... yet. Talk to Greg Bunce.", "Not on FGDB", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } else if (arcDataset.Workspace.WorkspaceFactory.WorkspaceType == esriWorkspaceType.esriRemoteDatabaseWorkspace) { //sde arcQFilter.WhereClause = cboCheckDecimals.Text.ToString() + " not like '%.0000%'"; } else { // shapefile MessageBox.Show("This function has not been coded to work on a shapefile... yet. Talk to Greg Bunce.", "Not on Shapefile", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } // select the records that have decimals ISelectionSet arcSelSet = arcTable.Select(arcQFilter, esriSelectionType.esriSelectionTypeHybrid, esriSelectionOption.esriSelectionOptionNormal, arcDataset.Workspace); ISelectFeaturesOperation arcSeleFeatOperation; arcSeleFeatOperation = new SelectFeaturesOperationClass(); arcSeleFeatOperation.ActiveView = clsGlobals.pActiveView; arcSeleFeatOperation.Layer = clsGlobals.arcFeatLayer; arcSeleFeatOperation.SelectionSet = arcSelSet; //perform the operation clsGlobals.pMxDocument.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null); IOperationStack arcOperationStack = clsGlobals.pMxDocument.OperationStack; arcOperationStack.Do((IOperation)arcSeleFeatOperation); clsGlobals.pMxDocument.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null); } catch (Exception ex) { MessageBox.Show("Error Message: " + Environment.NewLine + ex.Message + Environment.NewLine + Environment.NewLine + "Error Source: " + Environment.NewLine + ex.Source + Environment.NewLine + Environment.NewLine + "Error Location:" + Environment.NewLine + ex.StackTrace, "Push Utrans Roads to SGID!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
// select all the records from the specified field that have null or blank values private void btnSelectBlankNulls_Click(object sender, EventArgs e) { try { // clear the progress bar, in case it has been used before pBar.Value = 1; if (cboChooseFields.SelectedIndex == -1) { MessageBox.Show("Please select a field from the dropdown list", "Must Select Field", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } //show the cursor as busy System.Windows.Forms.Cursor.Current = Cursors.WaitCursor; // cast the layer to itable interface b/c it makes use of the layer's definition query or join, if any.. and does the select based on that ITable arcTable = (ITable)clsGlobals.arcFeatLayer; IDataset arcDataset = (IDataset)clsGlobals.arcFeatLayer; IQueryFilter arcQueryFilter = new QueryFilter(); arcQueryFilter.WhereClause = null; // check what type of layer this is, to determine the query syntax //shapefile// if (arcDataset.Workspace.WorkspaceFactory.WorkspaceType == esriWorkspaceType.esriFileSystemWorkspace) { //check the field type, look for either text or double/integer to determine what type of query to set up if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeString) { if (chkNullOnly.Checked == true) { arcQueryFilter.WhereClause = "\"" + cboChooseFields.Text.ToString().Trim() + "\" is null"; } else { arcQueryFilter.WhereClause = "\"" + cboChooseFields.Text.ToString().Trim() + "\" is null or \"" + cboChooseFields.Text.ToString().Trim() + "\" = ''"; } } else if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeDouble) { arcQueryFilter.WhereClause = "\"" + cboChooseFields.Text.ToString().Trim() + "\" is null"; } else if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeInteger) { arcQueryFilter.WhereClause = "\"" + cboChooseFields.Text.ToString().Trim() + "\" is null"; } else if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeSmallInteger) { arcQueryFilter.WhereClause = "\"" + cboChooseFields.Text.ToString().Trim() + "\" is null"; } else { MessageBox.Show("You're asking to do a query on a field type that is not supported by this code. If you need this field type to be supported talk to Greg Bunce. He will make it happen.", "Not Supported Field Type", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } //fgdb// if (arcDataset.Workspace.WorkspaceFactory.WorkspaceType == esriWorkspaceType.esriLocalDatabaseWorkspace) { //check the field type, look for either text or double/integer to determine what type of query to set up if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeString) { if (chkNullOnly.Checked == true) { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null"; } else { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null or " + cboChooseFields.Text.ToString().Trim() + " = ''"; } } else if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeDouble) { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null"; } else if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeInteger) { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null"; } else if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeSmallInteger) { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null"; } else { MessageBox.Show("You're asking to do a query on a field type that is not supported by this code. If you need this field type to be supported talk to Greg Bunce. He will make it happen.", "Not Supported Field Type", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } //sde// if (arcDataset.Workspace.WorkspaceFactory.WorkspaceType == esriWorkspaceType.esriRemoteDatabaseWorkspace) { //check the field type, look for either text or double/integer to determine what type of query to set up if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeString) { if (chkNullOnly.Checked == true) { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null"; } else { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null or (" + "LTRIM(RTRIM(" + cboChooseFields.Text.ToString().Trim() + ")) = '')"; } } else if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeDouble) { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null"; } else if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeInteger) { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null"; } else if (clsPushSgidStaticClass.GetArcGisFieldType(cboChooseFields.Text) == esriFieldType.esriFieldTypeSmallInteger) { arcQueryFilter.WhereClause = cboChooseFields.Text.ToString().Trim() + " is null"; } else { MessageBox.Show("You're asking to do a query on a field type that is currently not supported by this code. If you need this field type to be supported talk to Greg Bunce. He will make it happen.", "Not Supported Field Type", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } // select the records that have nulls or blanks ISelectionSet arcSelSet = arcTable.Select(arcQueryFilter, esriSelectionType.esriSelectionTypeHybrid, esriSelectionOption.esriSelectionOptionNormal, arcDataset.Workspace); ISelectFeaturesOperation arcSeleFeatOperation; arcSeleFeatOperation = new SelectFeaturesOperationClass(); arcSeleFeatOperation.ActiveView = clsGlobals.pActiveView; arcSeleFeatOperation.Layer = clsGlobals.arcFeatLayer; arcSeleFeatOperation.SelectionSet = arcSelSet; //perform the operation clsGlobals.pMxDocument.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null); IOperationStack arcOperationStack = clsGlobals.pMxDocument.OperationStack; arcOperationStack.Do((IOperation)arcSeleFeatOperation); clsGlobals.pMxDocument.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, null, null); ////IFeatureLayer arcFeatLayer = clsGlobals.pGFlayer; //IFeatureLayerDefinition arcFeatureLayerDef = (IFeatureLayerDefinition)clsGlobals.pGFlayer; //string strExistingDefQuery = arcFeatureLayerDef.DefinitionExpression; //// select the records that have nulls or blanks //IQueryFilter arcQueryFilter = new QueryFilter(); //arcQueryFilter.WhereClause = "(" + strExistingDefQuery + ") AND " + cboChooseFields.Text.ToString().Trim() + " is null"; //IDataset arcDataset = (IDataset)clsGlobals.pGFlayer.FeatureClass; //ISelectionSet arcSelSet = clsGlobals.pGFlayer.FeatureClass.Select(arcQueryFilter,esriSelectionType.esriSelectionTypeHybrid, esriSelectionOption.esriSelectionOptionNormal, arcDataset.Workspace); //clsGlobals.pActiveView.Refresh(); } catch (Exception ex) { MessageBox.Show("Error Message: " + Environment.NewLine + ex.Message + Environment.NewLine + Environment.NewLine + "Error Source: " + Environment.NewLine + ex.Source + Environment.NewLine + Environment.NewLine + "Error Location:" + Environment.NewLine + ex.StackTrace, "Push Utrans Roads to SGID error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } }
private void AddQALayerToActiveView(IMap map, IFeatureClass SourceLineFeatureClass, IFeatureClass SourcePolygonFeatureClass, string layerPathFile, double metersPerUnit, bool bIsBefore1022, bool bFabricIsInGCS) { if (map == null || layerPathFile == null || !layerPathFile.EndsWith(".lyr")) { return; } // Create a new GxLayer IGxLayer gxLayer = new GxLayerClass(); IGxFile gxFile = (IGxFile)gxLayer; // Set the path for where the layerfile is located on disk gxFile.Path = layerPathFile; // Test if we have a valid layer and add it to the map if (!(gxLayer.Layer == null)) { if (!(gxLayer.Layer is ICompositeLayer)) { return; } ICompositeLayer pCompLyr = (ICompositeLayer)gxLayer.Layer; for (int i = 0; i < pCompLyr.Count; i++) { ILayer pLyr = pCompLyr.get_Layer(i); // if (pLyr is IFeatureLayer) { IFeatureLayer pFlyr = (IFeatureLayer)pLyr; //now update the definition query IFeatureLayerDefinition pFeatLyrDef = (IFeatureLayerDefinition)pFlyr; string sLyrName = pFlyr.Name; bool bExc = false; if (sLyrName.Contains("Minus")) { pFlyr.FeatureClass = SourceLineFeatureClass; bExc = false; //ILayerFields pLayerFields = pFlyr as ILayerFields; //First turn off all layers //for (int kk = 0; kk < pLayerFields.FieldCount; kk++) //{ // IFieldInfo pFieldInfo = pLayerFields.get_FieldInfo(kk); // pFieldInfo.Visible = false; //} SetLabelExpressionOnFeatureLayer(pFlyr, out bExc); if (bExc || bFabricIsInGCS) { int jj = pFlyr.FeatureClass.FindField("ComputedMinusObserved"); if (jj > -1) { string sVal = (0.1 / metersPerUnit).ToString("0.00"); string sCminusO = pFlyr.FeatureClass.Fields.get_Field(jj).Name; pFeatLyrDef.DefinitionExpression = sCminusO + " > " + sVal + " AND " + sCminusO + " < " + sVal; //IFieldInfo pFieldInfo = pLayerFields.get_Field(jj) as IFieldInfo; //pFieldInfo.Visible = true; } continue; } string s = pFeatLyrDef.DefinitionExpression; int iField = SourceLineFeatureClass.FindField("ArcLength"); if (iField > -1) { //IFieldInfo pFieldInfo = pLayerFields.get_Field(iField) as IFieldInfo; //pFieldInfo.Visible = true; string s2 = SourceLineFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"ArcLength\"", s2); pFeatLyrDef.DefinitionExpression = s.Replace("ArcLength", s2); } s = pFeatLyrDef.DefinitionExpression; iField = SourceLineFeatureClass.FindField("Distance"); if (iField > -1) { //IFieldInfo pFieldInfo = pLayerFields.get_Field(iField) as IFieldInfo; //pFieldInfo.Visible = true; string s2 = SourceLineFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"Distance\"", s2); pFeatLyrDef.DefinitionExpression = s.Replace("Distance", s2); } s = pFeatLyrDef.DefinitionExpression; pFeatLyrDef.DefinitionExpression = s.Replace("Shape_Length", SourceLineFeatureClass.LengthField.Name); } else if (sLyrName.Contains("Parcel")) { //In 10.1 start editing crashes if the definition query in these layers that use POWER function is present. //Can test if the release is 10.1 and knock out the def query, or else exclude the layers. string s = pFeatLyrDef.DefinitionExpression; int iField = SourcePolygonFeatureClass.FindField("MiscloseDistance"); string s2 = SourcePolygonFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"MiscloseDistance\"", s2); pFeatLyrDef.DefinitionExpression = s.Replace("MiscloseDistance", s2); s = pFeatLyrDef.DefinitionExpression; iField = SourcePolygonFeatureClass.FindField("ShapeStdErrorE"); s2 = SourcePolygonFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"ShapeStdErrorE\"", s2); pFeatLyrDef.DefinitionExpression = s.Replace("ShapeStdErrorE", s2); s = pFeatLyrDef.DefinitionExpression; iField = SourcePolygonFeatureClass.FindField("ShapeStdErrorN"); s2 = SourcePolygonFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"ShapeStdErrorN\"", s2); pFeatLyrDef.DefinitionExpression = s.Replace("ShapeStdErrorN", s2); pFlyr.FeatureClass = SourcePolygonFeatureClass; SetLabelExpressionOnFeatureLayer(pFlyr, out bExc); if (s.ToLower().Contains("power") && bIsBefore1022) {//remove the def query CR278039 pFeatLyrDef.DefinitionExpression = ""; continue; } } } } gxLayer.Layer.Name = "QA Symbology"; IMxDocument pMXDoc = ArcMap.Document; IOperationStack pOpSt = pMXDoc.OperationStack; IAddLayersOperation pAddLyrOp = new AddLayersOperationClass(); pAddLyrOp.SetDestinationInfo(0, map, null); pAddLyrOp.Name = "Add Fabric QA Layer"; pAddLyrOp.AddLayer(gxLayer.Layer); IOperation pOp = (IOperation)pAddLyrOp; pOpSt.Do(pOp); } }
private void AddQALayerToActiveView(IMap map, IFeatureClass SourceLineFeatureClass, IFeatureClass SourcePolygonFeatureClass, string layerPathFile, double metersPerUnit, bool bIsBefore1022, bool bFabricIsInGCS) { if (map == null || layerPathFile == null || !layerPathFile.EndsWith(".lyr")) { return; } IWorkspace pWS = SourceLineFeatureClass.FeatureDataset.Workspace; bool bIsPostGres = false; if (pWS.Type != esriWorkspaceType.esriLocalDatabaseWorkspace) { IDatabaseConnectionInfo2 connectionInfo2 = (IDatabaseConnectionInfo2)(pWS); bIsPostGres = (connectionInfo2.ConnectionDBMS == esriConnectionDBMS.esriDBMS_PostgreSQL); } // Create a new GxLayer IGxLayer gxLayer = new GxLayerClass(); IGxFile gxFile = (IGxFile)gxLayer; // Set the path for where the layerfile is located on disk gxFile.Path = layerPathFile; // Test if we have a valid layer and add it to the map if (!(gxLayer.Layer == null)) { if (!(gxLayer.Layer is ICompositeLayer)) { return; } ICompositeLayer pCompLyr = (ICompositeLayer)gxLayer.Layer; for (int i = 0; i < pCompLyr.Count; i++) { ILayer pLyr = pCompLyr.get_Layer(i); // if (pLyr is IFeatureLayer) { IFeatureLayer pFlyr = (IFeatureLayer)pLyr; //now update the definition query IFeatureLayerDefinition pFeatLyrDef = (IFeatureLayerDefinition)pFlyr; string sLyrName = pFlyr.Name; bool bExc = false; if (sLyrName.Contains("Minus")) { pFlyr.FeatureClass = SourceLineFeatureClass; bExc = false; SetLabelExpressionOnFeatureLayer(pFlyr, out bExc); if (bExc || bFabricIsInGCS) { int jj = pFlyr.FeatureClass.FindField("ComputedMinusObserved"); if (jj > -1) { string sVal = (0.1 / metersPerUnit).ToString("0.00"); string sCminusO = pFlyr.FeatureClass.Fields.get_Field(jj).Name; pFeatLyrDef.DefinitionExpression = "(" + sCminusO + " > " + sVal + " OR " + sCminusO + " < -" + sVal + ") AND (" + sCminusO + " IS NOT NULL)"; if (bIsPostGres) { pFeatLyrDef.DefinitionExpression = "(((st_length(shape) - distance) > " + sVal + " OR (st_length(shape) - distance) < -" + sVal + " OR (distance - st_length(shape)) > " + sVal + " OR (distance - st_length(shape)) < -" + sVal + ") AND (radius IS NULL AND (densifytype IS NULL OR densifytype <> 3)) AND category <> 4) OR ( ( ((st_length(shape) - arclength) > " + sVal + " OR (st_length(shape) - arclength) < -" + sVal + ") OR (arclength - st_length(shape)) > " + sVal + " OR (arclength - st_length(shape)) < -" + sVal + ") AND ( NOT arclength IS NULL ) )"; //this is query for ST_Geometry as well as PG_Geometry } } continue; } string s = pFeatLyrDef.DefinitionExpression; int iField = SourceLineFeatureClass.FindField("ArcLength"); if (iField > -1) { string s2 = SourceLineFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"ArcLength\"", s2); pFeatLyrDef.DefinitionExpression = pFeatLyrDef.DefinitionExpression.Replace("ArcLength", s2); } s = pFeatLyrDef.DefinitionExpression; iField = SourceLineFeatureClass.FindField("Category"); if (iField > -1) { string s2 = SourceLineFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"Category\"", s2); pFeatLyrDef.DefinitionExpression = pFeatLyrDef.DefinitionExpression.Replace("Category", s2); } s = pFeatLyrDef.DefinitionExpression; iField = SourceLineFeatureClass.FindField("Radius"); if (iField > -1) { string s2 = SourceLineFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"Radius\"", s2); pFeatLyrDef.DefinitionExpression = pFeatLyrDef.DefinitionExpression.Replace("Radius", s2); } s = pFeatLyrDef.DefinitionExpression; iField = SourceLineFeatureClass.FindField("Distance"); if (iField > -1) { string s2 = SourceLineFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"Distance\"", s2); pFeatLyrDef.DefinitionExpression = pFeatLyrDef.DefinitionExpression.Replace("Distance", s2); } s = pFeatLyrDef.DefinitionExpression; iField = SourceLineFeatureClass.FindField("DensifyType"); if (iField > -1) { string s2 = SourceLineFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"DensifyType\"", s2); pFeatLyrDef.DefinitionExpression = pFeatLyrDef.DefinitionExpression.Replace("DensifyType", s2); } s = pFeatLyrDef.DefinitionExpression; pFeatLyrDef.DefinitionExpression = s.Replace("\"Shape_Length\"", SourceLineFeatureClass.LengthField.Name); pFeatLyrDef.DefinitionExpression = pFeatLyrDef.DefinitionExpression.Replace("Shape_Length", SourceLineFeatureClass.LengthField.Name); } else if (sLyrName.Contains("Parcel")) { //In 10.1 start editing crashes if the definition query in these layers that use POWER function is present. //Can test if the release is 10.1 and knock out the def query, or else exclude the layers. string s = pFeatLyrDef.DefinitionExpression; int iField = SourcePolygonFeatureClass.FindField("MiscloseDistance"); string s2 = SourcePolygonFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"MiscloseDistance\"", s2); pFeatLyrDef.DefinitionExpression = pFeatLyrDef.DefinitionExpression.Replace("MiscloseDistance", s2); s = pFeatLyrDef.DefinitionExpression; iField = SourcePolygonFeatureClass.FindField("ShapeStdErrorE"); s2 = SourcePolygonFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"ShapeStdErrorE\"", s2); pFeatLyrDef.DefinitionExpression = pFeatLyrDef.DefinitionExpression.Replace("ShapeStdErrorE", s2); s = pFeatLyrDef.DefinitionExpression; iField = SourcePolygonFeatureClass.FindField("ShapeStdErrorN"); s2 = SourcePolygonFeatureClass.Fields.get_Field(iField).Name; pFeatLyrDef.DefinitionExpression = s.Replace("\"ShapeStdErrorN\"", s2); pFeatLyrDef.DefinitionExpression = pFeatLyrDef.DefinitionExpression.Replace("ShapeStdErrorN", s2); pFlyr.FeatureClass = SourcePolygonFeatureClass; SetLabelExpressionOnFeatureLayer(pFlyr, out bExc); if (s.ToLower().Contains("power") && bIsBefore1022) {//remove the def query CR278039 pFeatLyrDef.DefinitionExpression = ""; continue; } } } } gxLayer.Layer.Name = "QA Symbology"; IMxDocument pMXDoc = ArcMap.Document; IOperationStack pOpSt = pMXDoc.OperationStack; IAddLayersOperation pAddLyrOp = new AddLayersOperationClass(); pAddLyrOp.SetDestinationInfo(0, map, null); pAddLyrOp.Name = "Add Fabric QA Layer"; pAddLyrOp.AddLayer(gxLayer.Layer); IOperation pOp = (IOperation)pAddLyrOp; pOpSt.Do(pOp); } }