阅读:1489回复:3
一个不详错误
<P>开发环境:VB+ENGINE</P>
<P>所有的程序在公司电脑里都能很正常的运行,系统环境都已经加设好了,但是把程序拷贝到家里电脑(所安装的环境跟公司一模一样),出现的问题主要是在创建feature的过程中,所有变量和对象的接口都是正确滴,因为在公司能运行:)</P> <P>程序目的:</P> <P>画完线后在当前层中加把所画的线加进去</P> <P>错误代码:</P> <P>set pFeature(接口是Ifeature)=pCurrentlayer(表示当前操作层,接口是Ifeaturelayer).featureclass.createfeature</P> <P>错误信息:</P> <P>与变量未定义信息一样</P> <P>我拷贝了好几个程序,都有创建feature的过程,都出错了,所以很多工作在家里都没办法做,很郁闷,有没有高人遇到过相同的问题?</P> <P>还有一个问题:</P> <P>在mousemove过程中通过hittest我已经找到了我需要的feature上的点,同时也用simplemarksymbol将它显示出来了,但是我需要在mousedown的时候mapcon.trackline,而且线的起点我希望就是hittest中的那个hitpoint,但是trackline中偶没找到设置起点的方法(应该是没有的吧:)),我也试图通过将hitpoint的值赋给maptopoint的这个鼠标点,但是也行不通。可能偶讲的比较模糊,举个比较直观的例子,如果在CAD中开了捕捉圆心,那在管线设施附近移动就能有小方框显示在设施上,同时如果我用pl方法的话,鼠标点下去(捕捉方框出现的情况下),那线的起点就会在那个管线设施的圆心上,效果就要那个样子:)</P> |
|
1楼#
发布于:2006-07-30 12:34
最好能给出实际点的代码,那样比较好调试
|
|
|
2楼#
发布于:2006-07-30 17:36
<P>红色部门为第一个错误的代码(在公司能运行,在家就不行,郁闷ing)</P>
<P>Public Function CreateFea(ByVal pGeo As IGeometry, ByVal pFeaLyr As IFeatureLayer) As IFeature<BR>Dim pFeature As IFeature<BR>Dim pWSEdit As IWorkspaceEdit<BR>Dim pDataSet As IDataset<BR> Set pDataSet = pFeaLyr.FeatureClass '创建图层<BR> Set pWSEdit = pDataSet.Workspace<BR> If pWSEdit.IsBeingEdited = False Then '判断是否处在编辑状态<BR> Set CreateFea = Nothing<BR> Else<BR> pWSEdit.StartEditOperation<BR> <FONT color=#ff0000> Set pFeature = pFeaLyr.FeatureClass.CreateFeature<BR></FONT> Set pFeature.Shape = pGeo<BR> pFeature.Store<BR> pWSEdit.StopEditOperation<BR> Set CreateFea = pFeature<BR> End If<BR>End Function</P> <P>第二个问题的代码:(下面是已经实现的鼠标移动追踪表示,但偶要的是mousedown的时候,trackline的起始点是从hitpoint出发,mousedown的代码还没头绪,拜求各位高人:))</P> <P>Private Sub MapCon_OnMouseMove(ByVal button As Long, ByVal shift As Long, ByVal x As Long, ByVal y As Long, ByVal mapX As Double, ByVal mapY As Double)<BR>Dim pPoint As IPoint<BR>Dim pPointB As IPoint<BR>Dim pPointHit As IHitTest<BR>Dim pPolylineHit As IHitTest<BR>Dim SelectFeatureEX As IFeature<BR> Set pPoint = New Point<BR> pPoint.x = mapX<BR> pPoint.y = mapY<BR> If AddPipeFlag = True Then<BR> ElseIf SplitPipeflag = True Then<BR> ElseIf JoinPipesflag = True Then<BR> ElseIf AddDeviceFlag = True Then<BR> ElseIf AddDeviceLabelFlag = True Then<BR> '捕捉设施<BR> '捕捉点<BR> Set SelectFeatureEX = SelectFeature(pPoint, pCurrentlayerPoint)<BR> If Not SelectFeatureEX Is Nothing Then '如果找到设施<BR> HittestDevice pPoint, pPointHit, SelectFeatureEX<BR> Else</P> <P> End If<BR> Else<BR> txtCoordX.Text = "X" ; " " ; "=" ; " " ; pPoint.x<BR> txtCoordY.Text = "Y" ; " " ; "=" ; " " ; pPoint.y<BR> End If<BR>' Set pCurrentlayerLine = pEditLayerPipe '需要捕捉的是线的两端,所以设Pipe层为当前层<BR>End Sub</P> <P>'获取地物Feature程序<BR>'========================<BR>Private Function SelectFeature(ByVal pPointCur As IPoint, ByVal pCurrentlayer As IFeatureLayer) As IFeature<BR>Dim pGeometeyCurrent As IGeometry<BR>Dim pTopologicalOperator As ITopologicalOperator<BR> txtCoordX.Text = pPointCur.x<BR> txtCoordY.Text = pPointCur.y<BR> Set pTopologicalOperator = pPointCur<BR> Set pGeometeyCurrent = pTopologicalOperator.Buffer(0.001) '这里的Buffer需要很小<BR>Dim pFilter As ISpatialFilter<BR> Set pFilter = New SpatialFilter<BR> With pFilter<BR> Set .Geometry = pGeometeyCurrent '地物形状就是Buffer的图形<BR> .GeometryField = "SHAPE" '查找字段<BR> .SpatialRel = esriSpatialRelIntersects<BR> End With<BR> <BR>Dim pFeatureCursor As IFeatureCursor '指针的集合<BR>Dim pFeature As IFeature<BR> Set pFeatureCursor = pCurrentlayer.FeatureClass.Search(pFilter, False)<BR> If Not pFeatureCursor Is Nothing Then '如果有知道符合条件的feature<BR> Set pFeature = pFeatureCursor.NextFeature '指向下一个feature<BR> Set SelectFeature = pFeature<BR> Else<BR> Set SelectFeature = Nothing<BR> Exit Function<BR> End If<BR>End Function</P> <P>'捕捉设备中心显示程序<BR>Private Function HittestDevice(ByVal pPoint As IPoint, pPointHit As IHitTest, pSelectFeature As IFeature)<BR>Dim pGeometryDevice As IGeometry '定义一个当前几何形状<BR>Dim pTopologicalOperatorDevice As ITopologicalOperator '创建一个新的拓扑<BR>Dim Bhit As Boolean<BR>Dim dDist As Double<BR>Dim lPartIndex As Long<BR>Dim lSegIndex As Long<BR>Dim Bright As Boolean<BR>Dim pEnvelope As IEnvelope<BR>Dim pFeaturePoint As IPoint '定义找到的设施的形状<BR>Dim pHitPoint As IPoint<BR>Set pHitPoint = New Point<BR>'重设变量<BR> dDist = 0<BR> lPartIndex = 0<BR> lSegIndex = 0<BR> Bright = False<BR> Bhit = False<BR> Set pFeaturePoint = pSelectFeature.Shape '把设施的shape赋予点<BR> Set pTopologicalOperatorDevice = pFeaturePoint '对点进行拓扑操作<BR> Set pGeometryDevice = pTopologicalOperatorDevice.Buffer(1) '这里的点的Buffer是用来Buffer设施的,形成一个多边形<BR> Set pEnvelope = pGeometryDevice.Envelope '把多边形外框赋给pEnvelope用来捕捉中心点<BR> Set pPointHit = pEnvelope<BR> Bhit = pPointHit.HitTest(pPoint, 1, esriGeometryPartCentroid, pHitPoint, dDist, lPartIndex, lSegIndex, Bright) '捕捉到这个点<BR>'Create the Simple Marker<BR> Dim pSmplMarker As ISimpleMarkerSymbol<BR> Set pSmplMarker = New SimpleMarkerSymbol<BR> pSmplMarker.Style = esriSMSDiamond<BR>'Create a red RGB color for the Outline<BR> Dim pRGBClr As IRgbColor<BR> Set pRGBClr = New RgbColor<BR> pRGBClr.Red = 255<BR>'Add the Outline properties to the Simple Marker<BR> pSmplMarker.Outline = True<BR> pSmplMarker.OutlineSize = 2<BR> pSmplMarker.OutlineColor = pRGBClr '上面几句已经把hitpoint的追踪点画出来了<BR> MapCon.FlashShape pHitPoint, 3, 300, pSmplMarker<BR>' MsgBox pPoint.x<BR>' MsgBox pPoint.y<BR>' MsgBox pHitPoint.x<BR>' MsgBox pHitPoint.y<BR>End Function</P> <P>第三个问题:(估计在论坛中已经出现过了,请再不吝赐教)</P> <P>我创建了一条polyline,想要给它赋值,我不知道是否要打开一个表,所以我dim ptable as itable,然后指向了我所创建的polyline的feature的table,同时</P> <P>'确定表编辑启动模块<BR>Public Function StartEditFeaTbl(ByVal pTable As ITable) As Boolean<BR>Dim pWSEdit As IWorkspaceEdit '定义编辑工作空间<BR>Dim pDataSet As IDataset<BR> If pTable Is Nothing Then<BR> StartEditFeaTbl = False<BR> Else<BR> Set pDataSet = pTable<BR> Set pWSEdit = pDataSet.Workspace<BR> If pWSEdit.IsBeingEdited Then<BR> StartEditFeaTbl = True<BR> Else<BR> pWSEdit.StartEditing True<BR> pWSEdit.EnableUndoRedo<BR> StartEditFeaTbl = True<BR> End If<BR> End If<BR>End Function</P> <P>但是feature.VALUE的值我却想不到应该如何去加,因为我画出来的polyline在catalog中看,只有objectid和shape,shape.len是有值的,其他的都是null:(,我需要的就是把那些为null的field值都读取或者修改为相应的value值,并且用store和update的方式存储,拜求!</P> |
|
3楼#
发布于:2006-07-31 10:41
<P>第一个问题:你编辑的数据是否SDE数据库里的数据?</P>
<P>第二个问题:你在建立了polyline后,就可以利用polyline(feature)的value属性来更新属性数值,</P> |
|
|