gisleonzhouly
路人甲
路人甲
  • 注册日期2006-07-24
  • 发帖数15
  • QQ
  • 铜币157枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1489回复:3

一个不详错误

楼主#
更多 发布于:2006-07-29 19:41
<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>
喜欢0 评分0
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
1楼#
发布于:2006-07-30 12:34
最好能给出实际点的代码,那样比较好调试
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
gisleonzhouly
路人甲
路人甲
  • 注册日期2006-07-24
  • 发帖数15
  • QQ
  • 铜币157枚
  • 威望0点
  • 贡献值0点
  • 银元0个
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>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15951
  • QQ
  • 铜币25345枚
  • 威望15368点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国明星
  • GIS帝国铁杆
3楼#
发布于:2006-07-31 10:41
<P>第一个问题:你编辑的数据是否SDE数据库里的数据?</P>
<P>第二个问题:你在建立了polyline后,就可以利用polyline(feature)的value属性来更新属性数值,</P>
GIS麦田守望者,期待与您交流。
举报 回复(0) 喜欢(0)     评分
游客

返回顶部