测量点根据高程投影到剖面上,花了一天时间,算是可以了【EPS基于vbs】

    科技2022-07-11  90

     立面图都是垂直于xoy平面的,我的思路是,绘制一条线,该线为面上的线,根据该线计算面的法向量,然后选中的点任意一点作为面上的点,面上点和法向量唯一确定一个投影面,先将点都投影到这个面,然后将所有点旋转到水平方向,最后根据高程将点“立”起来。没有做异常处理。设计到计算【点在面上投影坐标】、【点绕点旋转】、【计算两点连线与x轴夹角】这三个小问题。当然也有别的思路,比如投影到面上之后,由于都是旋转到水平方向,y轴坐标和旋转点值是一样的,根据距离就可以计算,前提是要判断方向。代码如下,效果见代码后

    '将测量点根据高程和投影面展点,用于日照分析测量三视图,断面绘制 '简单模式,一次只操作一个面,选中面上点及方向线,执行脚本,确定,左键 dim a,b,c'投影面法向量 dim xm,ym,zm'投影面上的一点,选择选中的第一个点,法向量和该点唯一确定了投影面 dim ax(),ay(),az(),an()'待转点,n为点名 dim pointCnt'点数 dim deltX,deltY'方向线的坐标差 pointCnt=0 dim lineCnt'线数 dim mx,my'移动后的旋转中心 Const Pi=3.14159265358979323 Sub OnInitScript() mode = 0 '=0 无参数对话框 =1 有参数对话框 title="功能名称" SSProcess.ShowScriptDlg mode,title SSProcess.UpdateSysSelection 0 dim cnt cnt= SSProcess.GetSelGeoCount '遍历选择的地物,获取所有点和法线向量 for i = 0 to cnt-1 objType=SSProcess.GetSelGeoValue (i, "SSObj_Type") if objType="POINT" then pointCnt=pointCnt+1'点数累加 redim preserve ax(pointCnt),ay(pointCnt),az(pointCnt),an(pointCnt) SSProcess.GetSelGeoPoint i, 0, x, y, z, ptype, name ax(pointCnt-1)=x:ay(pointCnt-1)=y:az(pointCnt-1)=z:an(pointCnt-1)=name elseif objType="LINE" Then SSProcess.GetSelGeoPoint i, 0, xs, ys, zs, ptype, name SSProcess.GetSelGeoPoint i, 1, xe, ye, ze, ptype, name '一条线,根据线斜率,计算投影面的法向量 deltX=xe-xs:deltY=ye-ys a=deltY:b=-deltX:c=0 end if next xm=ax(0):ym=ay(0):zm=az(0)'面上一点 '遍历所有点,计算点在面上投影 for i=0 to pointCnt-1 GetPrjPoint a,b,c,xm,ym,zm,ax(i),ay(i),az(i) next End Sub Sub OnExitScript() '添加代码 End Sub Sub OnOK() End Sub Sub OnCancel() End Sub Function OnLButtonDown(x, y, spx, spy, flags) mx=spx:my=spy dx=ax(0)-mx:dy=ay(0)-my '将投影后的点平移到左键处 for i=0 to pointCnt-1 ax(i)=ax(i)-dx:ay(i)=ay(i)-dy next angle=GetRotationAngle( 0,0,DeltX,deltY)'计算旋转角 '计算旋转点 for i=0 to pointCnt-1 Rotation mx,my,ax(i),ay(i),angle'旋转 '绘制该点 SSProcess.CreateNewObjByCode 9 SSProcess.AddNewObjPoint ax(i),ay(i)+az(i)-15,az(i),code,an(i) SSProcess.AddNewObjToSaveObjList NEXT End Function '求点在平面上的投影,其中平面由法向量和面上一点确定 '(x0,y0,z0)为法向量,(x1,y1,z1)为面上点,(x2,y2,z2)为待计算点 function GetPrjPoint(x0,y0,z0,x1,y1,z1,byref x2,byref y2,byref z2) t=(x0*x1+y0*y1+z0*z1-(x0*x2+y0*y2+z0*z2))/(x0^2 +y0^2 +z0^2) x2=x2+x0*t y2=y2+y0*t z2=z2+z0*t end function '计算两点之间连线与x轴之间的角度(顺时针) Function GetRotationAngle(x1,y1,x2,y2) dx = x2 - x1 dy = y2 - y1 GetRotationAngle=atn(dy/dx)*180/Pi if dx=0 and dy>0 then GetRotationAngle=90 elseif dx=0 and dy<0 then GetRotationAngle=270 elseif dy<0 and dx<0 then GetRotationAngle=GetRotationAngle+180 end if End Function '执行旋转操作,x0,y0为旋转中心,xs,ys为要旋转的点,ang为旋转的角度,单位为角度 Sub Rotation(x0,y0, xs, ys,byval ang) ang=Pi*ang/180 xa= (xs - x0)*cos(ang) +(ys - y0)*sin(ang) + x0 ya= -(xs - x0)*sin(ang) + (ys - y0)*cos(ang) + y0 xs=xa ys=ya End Sub

    Processed: 0.016, SQL: 8