请选择 进入手机版 | 继续访问电脑版

01BIM社区

 找回密码
 立即注册

扫一扫,访问微社区

查看: 5292|回复: 3

BaseMain_01KJ类

[复制链接]

155

主题

643

帖子

2531

积分

金牌会员

Rank: 6Rank: 6

积分
2531
发表于 2019-9-19 12:58:53 | 显示全部楼层 |阅读模式
BaseMain_01KJ类


回复

使用道具 举报

155

主题

643

帖子

2531

积分

金牌会员

Rank: 6Rank: 6

积分
2531
 楼主| 发表于 2019-9-19 13:00:56 | 显示全部楼层
本帖为密码帖 ,请输入密码 
回复 支持 反对

使用道具 举报

155

主题

643

帖子

2531

积分

金牌会员

Rank: 6Rank: 6

积分
2531
 楼主| 发表于 2021-10-7 11:13:58 | 显示全部楼层
module Tzbm_Common
class BaseMain_01KJ < UI::WebDialog
        #attr_accessor :dialog_title, :scrollable, :pref_key, :width, :height, :left, :top, :resizable;
        attr_accessor :m_PtArr,:pt1,:pt2,:m_BaseEnt1,:m_BaseEnt2;
=begin
        def initialize(dialog_title="XXX",\
                                                scrollable=true,\
                                                pref_key="",\
                                                width=368,\
                                                height=600,\
                                                left=72,\
                                                top=145,\
                                                resizable=true)

                super(dialog_title,scrollable,pref_key,width,height,left,top,resizable);
=end
        def initialize(dialog_title="XXX",\
                                                scrollable=true,\
                                                pref_key="",\
                                                width=385,\
                                                height=975,\
                                                left=72,\
                                                top=145,\
                                                resizable=true)
                super(dialog_title,scrollable,pref_key,width,height,left,top,resizable);
                #创建界面
                @dialog_title=dialog_title;
                @scrollable=scrollable;
                @pref_key=pref_key;
                @width=width;
                @height=height;
                @left=left;
                @top=top;
                @resizable=true;
               
               
                @mDrawBase=Tzbm_Common:rawBase_01KJ.new;
                #人机交互基本参数
                @coordsLength=1000000.m;#坐标轴长度               
                @ip1= Sketchup::InputPoint.new
                @ip2= Sketchup::InputPoint.new
                @pt1=Geom:oint3d.new(0,0,0);
                @pt2=Geom:oint3d.new(0,0,0);
                @state=0;
                @m_PtArr=Array.new();
                @mValueStr="";#SB_VCB_VALUE对应的文字
                @mAxisOn=0;#0:开;1:关
               
                @mSystemObj=Tzbm_Common::SystemVariableClass_01KJ.new();
                @mSystemObj.m_Key="ixelWinSize";
                tmpSize=@mSystemObj.getValue();
                if tmpSize.class==NilClass
                        @m_PixelWinSize=5;
                else
                        @m_PixelWinSize=tmpSize.to_i;
                end
               
                @m_PixelWinStr="第1点:";
                @m_PtNum=1;
                @mOsnap=0;
                #关闭窗口
                set_on_close do
                        Sketchup.active_model.select_tool nil;
                end
        end
        def activate
                puts 'Your tool has been activated.'
        end
        def deactivate(view)
                close;
        $Plan01Loader.exitTool;
        view.invalidate;
        end
        def onCancel(flags, view)
                reset(view)
        end       
        def reset(view)
                @state=0;
            @ip1.clear;
            @ip2.clear;
            @pt1=Geom:oint3d.new;
            @pt2=Geom:oint3d.new;
            if( view )
                view.tooltip = nil;
                view.invalidate;
            end
            @m_PtArr.clear;
            @mValueStr="";
            @mAxisOn=0;
            @m_PixelWinStr="第1点:";
            @m_PtNum=1;
            @mOsnap=0;
        end               
        def onMouseMove(flags, x, y, view)
                #puts("@ip1.valid?=<"+@ip1.valid?.to_s+">");
                if (@state==0)
                        @ip1.pick view,x,y;         #将视口坐标(view,x,y)转换为InputPoint类变量@ip1
                        @pt1=@ip1.position;
                        view.tooltip=@ip1.tooltip;
                        view.invalidate;
                else
                        #自动关系开启
                        if @mOsnap==0
                                @ip2.pick view,x,y,@ip1;    #将视口坐标(view,x,y)转换为InputPoint类变量@ip2
                        #自动关系关闭
                        else
                                @ip2.pick view,x,y;
                        end
                        @pt2=@ip2.position;
                        #自动捕捉开启
                        if @mOsnap==0
                                view.tooltip=@ip2.tooltip;
                        end
                        view.invalidate;
                end
        end       
        def draw(view)
                if (@m_PtArr.class==Array and !@m_PtArr.empty?)
                        @ip1 = Sketchup::InputPoint.new(@m_PtArr.last);
                        #@pt1 = @m_PtArr.last;
                end
                if (@state==0)
                        if (@ip1.valid? )
                                @ip1.draw(view);
                        @pt1=@ip1.position;
                                self.drawAxis(@pt1,view) if (@mAxisOn==0);
                                self.drawPixelWin(@pt1, view);
                        end
                else
                        if (@ip2.valid? )
                                #自动捕捉开启
                                if @mOsnap==0       
                                @ip2.draw(view);
                        end
                        @pt2=@ip2.position;
                        self.drawAxis(@pt2,view) if (@mAxisOn==0);
                        self.drawPixelWin(@pt2, view);
                        if @m_PtArr.class!=NilClass
                                        self.drawViewLine(view, @pt2);
                                end
                                tmpPt=@m_PtArr.last;
                                if tmpPt.class==Geom:oint3d
                                        @mValueStr=@pt2.distance(tmpPt).to_s;
                                        Sketchup.set_status_text @mValueStr, SB_VCB_VALUE
                                end
                        end
                end
               
                ##更新光标尺寸
                @mSystemObj.m_Key="ixelWinSize";
                tmpPixelWinSize=@mSystemObj.getValue().to_i;
                if tmpPixelWinSize.class!=NilClass
                        @m_PixelWinSize=tmpPixelWinSize;
                end
        end               
        def onLButtonDown(flags, x, y, view)
                if (@state==0)
                        @ip1.pick view,x,y;
                    if (@ip1.valid?)
                            @pt1=@ip1.position;
                            tmpPt=@pt1;
                    #使用像素框功能点选实体
                                mSelector=Tzbm_Common::SelectClass_01KJ.new();
                                mSelector.m_Point1=tmpPt;
                                mSelector.m_PixelWinSize=@m_PixelWinSize;
                                tmpEntSel=mSelector.selectPoint();
                        #根据程序需要筛选获得所需的点选实体集
                                tmpEntArr=Array.new();
                                tmpEntSel.each{|ent|
                                        if ent.class==Sketchup::Edge
                                                if ent.curve.class==Sketchup::ArcCurve
                                                        tmpEntArr.push(ent.curve);
                                                else
                                                        tmpEntArr.push(ent);
                                                end
                                        elsif ent.class==Sketchup::Group and \
                                                                ((ent.class==Sketchup::Group and ent.get_attribute("EntityAttribute","EntityClass")=="Line_01KJ") or \
                                                                (ent.class==Sketchup::Group and ent.get_attribute("EntityAttribute","EntityClass")=="Arc_01KJ") or \
                                                                (ent.class==Sketchup::Group and ent.get_attribute("EntityAttribute","EntityClass")=="ElevationText_01KJ"))
                                                tmpEntArr.push(ent);
                                        end
                                }
                                tmpEntArr.uniq!();
                               
                                if tmpEntArr.size>0
                                        #计算特征点
                                        tmpOsMode=@mSystemObj.getKeyValue("OsMode").to_i;
                                        tmpPtNew=@mDrawBase.mMath.getOsModePoint(tmpEntArr,tmpPt,tmpOsMode);
                                        @m_BaseEnt1=tmpEntArr[0];
                                        @pt1=tmpPtNew;
                                end
                            @m_PtArr.push(@pt1.clone);
                            @state=1;
                            @m_PtNum+=1;
                            @m_PixelWinStr="第"+@m_PtNum.to_s+"点:";
                    end
                else
                        #@ip2.pick view,x,y,@ip1;
                        #自动关系开启
                        if @mOsnap==0
                                @ip2.pick view,x,y,@ip1;    #将视口坐标(view,x,y)转换为InputPoint类变量@ip2
                        #自动关系关闭
                        else
                                @ip2.pick view,x,y;
                        end
               
                    if (@ip2.valid?)
                            @pt2=@ip2.position;
                            tmpPt=@pt2;
                    #使用像素框功能点选实体
                                mSelector=Tzbm_Common::SelectClass_01KJ.new();
                                mSelector.m_Point1=tmpPt;
                                mSelector.m_PixelWinSize=@m_PixelWinSize;
                                tmpEntSel=mSelector.selectPoint();
                        #根据程序需要筛选获得所需的点选实体集
                                tmpEntArr=Array.new();
                                tmpEntSel.each{|ent|
                                        if ent.class==Sketchup::Edge
                                                if ent.curve.class==Sketchup::ArcCurve
                                                        tmpEntArr.push(ent.curve);
                                                else
                                                        tmpEntArr.push(ent);
                                                end
                                        elsif ent.class==Sketchup::Group and \
                                                                ((ent.class==Sketchup::Group and ent.get_attribute("EntityAttribute","EntityClass")=="Line_01KJ") or \
                                                                (ent.class==Sketchup::Group and ent.get_attribute("EntityAttribute","EntityClass")=="Arc_01KJ") or \
                                                                (ent.class==Sketchup::Group and ent.get_attribute("EntityAttribute","EntityClass")=="ElevationText_01KJ"))
                                                tmpEntArr.push(ent);
                                        end
                                }
                                tmpEntArr.uniq!();
                               
                                if tmpEntArr.size>0
                                        #计算特征点
                                        tmpOsMode=@mSystemObj.getKeyValue("OsMode").to_i;
                                        tmpPtNew=@mDrawBase.mMath.getOsModePoint(tmpEntArr,tmpPt,tmpOsMode);
                                        @m_BaseEnt2=tmpEntArr[0];
                                        @pt2=tmpPtNew;
                                end

                            @m_PtArr.push(@pt2.clone);
                            @m_PixelWinStr="第1点:";
                            @m_PtNum+=1;
                            @m_PixelWinStr="第"+@m_PtNum.to_s+"点:";
                            #@ip1.copy! @ip2;
                        #@pt1=@pt2;
                    end
                end
        end       
回复 支持 反对

使用道具 举报

155

主题

643

帖子

2531

积分

金牌会员

Rank: 6Rank: 6

积分
2531
 楼主| 发表于 2021-10-7 11:17:17 | 显示全部楼层
        def onRButtonUp(flags,x,y,view)
            puts(@m_PtArr);
        end
        def onKeyDown(key, repeat, flags, view)
                p key;
                #点击Ctrl键,点击坐标点数组向后退一步
            if (key==COPY_MODIFIER_KEY)
                    if @m_PtArr.size>0
                            @m_PtArr.delete_at(-1);
                            @m_PtNum-=1;
                            @m_PixelWinStr="第"+@m_PtNum.to_s+"点:";
                            #由空间三维坐标点更新InputPoint类变量@ip1
                            @ip1 = Sketchup::InputPoint.new(@m_PtArr.last);
                    else
                            puts("点击坐标点数组已为空,请重新点击增加绘制点!");
                    end
            #点击Shift键,锁定方向
                elsif (key == CONSTRAIN_MODIFIER_KEY && repeat == 1 )
                @shift_down_time = Time.now
                #puts @shift_down_time;
                if( view.inference_locked? )
                    view.lock_inference
                elsif( @state == 0 && @ip1.valid? )
                    view.lock_inference @ip1
                elsif( @state == 1 && @ip2.valid? )
                    view.lock_inference @ip2, @ip1
                end
            #点击~键,开关辅助轴线
        elsif (key == 192)
                if @mAxisOn==0
                        @mAxisOn=1
                else
                        @mAxisOn=0
                end
                view.invalidate;
        #关开自动捕捉
        elsif (key == 78)
                if @mOsnap==0
                        @mOsnap=1;
                else
                        @mOsnap=0;
                end
            end
    end       
    def onUserText(text, view)
                #输入绝对坐标,判断绝对坐标数字符串的正则表达式
                if (text =~ /\[((-?\d*\.\d*)|(-?\d*)),((-?\d*\.\d*)|(-?\d*)),((-?\d*\.\d*)|(-?\d*))\]/)
                        puts("输入绝对坐标值:"+text);
                        tmpStr=text[1...-1];
                        tmpStrPt=tmpStr.split(",");
                        tmpPt=Geom:oint3d.new();
                        #单位
                        tmpArr=@mSystemObj.getSystemUnits();
                        #UI.messagebox tmpArr
                        p "长度格式和单位:"+tmpArr.to_s;
                        if tmpArr.class==Array
                                if tmpArr==[0,2]
                                        p "长度格式和单位(十进制,mm),按mm进行转换!";
                                        tmpPt.x=tmpStrPt[0].to_f.mm;
                                        tmpPt.y=tmpStrPt[1].to_f.mm;
                                        tmpPt.z=tmpStrPt[2].to_f.mm;
                                elsif tmpArr==[0,4]
                                        #UI.messagebox 2
                                        p "长度格式和单位(十进制,m),按m进行转换!";
                                        tmpPt.x=tmpStrPt[0].to_f.m;
                                        tmpPt.y=tmpStrPt[1].to_f.m;
                                        tmpPt.z=tmpStrPt[2].to_f.m;
                                else
                                        p "长度格式和单位(其他),按mm进行转换!";
                                        tmpPt.x=tmpStrPt[0].to_f.mm;
                                        tmpPt.y=tmpStrPt[1].to_f.mm;
                                        tmpPt.z=tmpStrPt[2].to_f.mm;
                                end
                        else
                                tmpPt.x=tmpStrPt[0].to_f.mm;
                                tmpPt.y=tmpStrPt[1].to_f.mm;
                                tmpPt.z=tmpStrPt[2].to_f.mm;
                        end
                        #UI.messagebox tmpPt
                        #UI.messagebox tmpPt.x.to_mm
                       
                        @pt2=tmpPt.clone;
                        @m_PtArr.push(@pt2.clone);
                        #UI.messagebox @m_PtArr
                        #由空间三维坐标点更新InputPoint类变量@ip1
                    #@ip1 = Sketchup::InputPoint.new(@m_PtArr.last)
                        #@pt1=@pt2.clone;
                       
                        @m_PtNum+=1;
                    @m_PixelWinStr="第"+@m_PtNum.to_s+"点:";
                        @state+=1;
                #输入相对坐标,判断相对坐标数字符串的正则表达式
                elsif (text =~ /\<((-?\d*\.\d*)|(-?\d*)),((-?\d*\.\d*)|(-?\d*)),((-?\d*\.\d*)|(-?\d*))\>/)
                        puts("输入相对坐标值:"+text);
                        tmpStr=text[1...-1];
                        tmpStrPt=tmpStr.split(",");
                        tmpPt=Geom:oint3d.new();
                        #单位
                        tmpArr=@mSystemObj.getSystemUnits();
                        p "长度格式和单位:"+tmpArr.to_s;
                        if tmpArr.class==Array
                                if tmpArr==[0,2]
                                        p "长度格式和单位(十进制,mm),按mm进行转换!";
                                        tmpPt.x=tmpStrPt[0].to_f.mm;
                                        tmpPt.y=tmpStrPt[1].to_f.mm;
                                        tmpPt.z=tmpStrPt[2].to_f.mm;
                                elsif tmpArr==[0,4]
                                        p "长度格式和单位(十进制,m),按m进行转换!";
                                        tmpPt.x=tmpStrPt[0].to_f.m;
                                        tmpPt.y=tmpStrPt[1].to_f.m;
                                        tmpPt.z=tmpStrPt[2].to_f.m;
                                else
                                        p "长度格式和单位(其他),按mm进行转换!";
                                        tmpPt.x=tmpStrPt[0].to_f.mm;
                                        tmpPt.y=tmpStrPt[1].to_f.mm;
                                        tmpPt.z=tmpStrPt[2].to_f.mm;
                                end
                        else
                                tmpPt.x=tmpStrPt[0].to_f.mm;
                                tmpPt.y=tmpStrPt[1].to_f.mm;
                                tmpPt.z=tmpStrPt[2].to_f.mm;
                        end                       
                        if (@m_PtArr.last.class!=NilClass)
                                mOriginRelative=@m_PtArr.last;                       
                        else
                                mOriginRelative=@mDrawBase.mOrigin;
                        end                       
                        @pt2.x=mOriginRelative.x+tmpPt.x;
                        @pt2.y=mOriginRelative.y+tmpPt.y;
                        @pt2.z=mOriginRelative.z+tmpPt.z;
                        @m_PtArr.push(@pt2.clone);
                        #由空间三维坐标点更新InputPoint类变量@ip1
                    #@ip1 = Sketchup::InputPoint.new(@m_PtArr.last)
                        #@pt1=@pt2.clone;               
                        @m_PtNum+=1;
                    @m_PixelWinStr="第"+@m_PtNum.to_s+"点:";
                        @state+=1;
                #输入极坐标,判断相对坐标数字符串的正则表达式
                elsif (text =~ /\(((-?\d*\.\d*)|(-?\d*)),((-?\d*\.\d*)|(-?\d*)),((-?\d*\.\d*)|(-?\d*))\)/)
                        puts("输入极坐标值:"+text);
                        tmpStr=text[1...-1];
                        tmpStrPt=tmpStr.split(",");
                        #tmpLength=tmpStrPt[0].to_i.mm;
                        #单位
                        tmpArr=@mSystemObj.getSystemUnits();
                        p "长度格式和单位:"+tmpArr.to_s;
                        if tmpArr.class==Array
                                if tmpArr==[0,2]
                                        p "长度格式和单位(十进制,mm),按mm进行转换!";
                                        tmpLength=tmpStrPt[0].to_f.mm;
                                elsif tmpArr==[0,4]
                                        p "长度格式和单位(十进制,m),按m进行转换!";
                                        tmpLength=tmpStrPt[0].to_f.m;
                                else
                                        p "长度格式和单位(其他),按mm进行转换!";
                                        tmpLength=tmpStrPt[0].to_f.mm;
                                end
                        else
                                tmpLength=tmpStrPt[0].to_f.mm;
                        end
                        tmpAngleRelativeX=tmpStrPt[1].to_i.degrees;
                        tmpAngleRelativeXOY=tmpStrPt[2].to_i.degrees;
                        trR1=Geom::Transformation.rotation(@mDrawBase.mOrigin,@mDrawBase.mVtZ,tmpAngleRelativeX);
                        tmpVt1=@mDrawBase.mVtX.transform(trR1);
                        tmpNormmal=tmpVt1*@mDrawBase.mVtZ;
                        trR2=Geom::Transformation.rotation(@mDrawBase.mOrigin,tmpNormmal,tmpAngleRelativeXOY);
                        tmpVt2=tmpVt1.transform(trR2);
                        if (@m_PtArr.last.class!=NilClass)
                                tmpPt=@m_PtArr.last;                       
                        else
                                tmpPt=@mDrawBase.mOrigin;
                        end
                        @pt2=tmpPt.offset(tmpVt2,tmpLength);
                        @m_PtArr.push(@pt2.clone);
                        #由空间三维坐标点更新InputPoint类变量@ip1
                    #@ip1 = Sketchup::InputPoint.new(@m_PtArr.last)
                        #@pt1=@pt2.clone;       
                        @m_PtNum+=1;
                    @m_PixelWinStr="第"+@m_PtNum.to_s+"点:";
                        @state+=1;
                #输入长度值,判断浮点数字符串的正则表达式
                elsif (text =~ /^-?(\d*.\d*)$/)
                        puts("输入相对坐标长度值:"+text);
                        #mLength=text.to_f.mm;
                        #单位
                        tmpArr=@mSystemObj.getSystemUnits();
                        p "长度格式和单位:"+tmpArr.to_s;
                        if tmpArr.class==Array
                                if tmpArr==[0,2]
                                        p "长度格式和单位(十进制,mm),按mm进行转换!";
                                        mLength=text.to_f.mm;
                                elsif tmpArr==[0,4]
                                        p "长度格式和单位(十进制,m),按m进行转换!";
                                        mLength=text.to_f.m;
                                else
                                        p "长度格式和单位(其他),按mm进行转换!";
                                        tmLength=text.to_f.mm;
                                end
                        else
                                mLength=text.to_f.mm;
                        end
                        if (mLength.class!=Length)
                                puts("输入值未转换为长度类型!");
                                return nil;
                        end
                        if (!@m_PtArr.empty?)
                                tmpPt=@m_PtArr.last
                                vec = @pt2 - tmpPt;
                                if vec.length!=0
                                        vec.length=mLength;
                                        @pt2=tmpPt.offset(vec);
                                        @m_PtArr.push(@pt2);
                                        @m_PtNum+=1;
                                    @m_PixelWinStr="第"+@m_PtNum.to_s+"点:";
                                        @state+=1;
                                else
                                        puts("鼠标点与基准点重叠,延伸向量长度为零,请重新移动鼠标点!");
                                end
                        else
                                puts("无第一个绘制点,请通过鼠标点击或输入绝对、相对、极坐标等方式确定第一个绘制点后再输入长度值!");
                        end

                        #由空间三维坐标点更新InputPoint类变量@ip1
                    #@ip1 = Sketchup::InputPoint.new(@m_PtArr.last)
                        #@pt1=@pt2.clone;
                else
                        puts("输入字符串格式有误,请重新输入!")
                end
    end   
        def drawAxis(point, view)
                mTrans=Sketchup.active_model.axes.transformation               
                #绘制x轴
                pointX1=point.offset(Geom::Vector3d.new(1,0,0).transform(mTrans),-@coordsLength);
                pointX2=point.offset(Geom::Vector3d.new(1,0,0).transform(mTrans),@coordsLength);
                view.drawing_color="red";
                view.line_width=1;
                view.draw_line pointX1,pointX2;
                #绘制y轴
                pointX3=point.offset(Geom::Vector3d.new(0,1,0).transform(mTrans),-@coordsLength);
                pointX4=point.offset(Geom::Vector3d.new(0,1,0).transform(mTrans),@coordsLength);
                view.drawing_color="green";
                view.line_width=1;
                view.draw_line pointX3,pointX4;
                #绘制z轴
                pointX5=point.offset(Geom::Vector3d.new(0,0,1).transform(mTrans),-@coordsLength);
                pointX6=point.offset(Geom::Vector3d.new(0,0,1).transform(mTrans),@coordsLength);
                view.drawing_color="blue";
                view.line_width=1;
                view.draw_line pointX5,pointX6;
        end
       
        def drawPixelWin(point, view)
                #绘制交叉窗口
                tmpPt=view.screen_coords(point);
                tmpPt1=Geom:oint3d.new(tmpPt.x-@m_PixelWinSize,tmpPt.y-@m_PixelWinSize,0);
                tmpPt2=Geom:oint3d.new(tmpPt1.x+@m_PixelWinSize*2,tmpPt1.y,0);
                tmpPt3=Geom:oint3d.new(tmpPt2.x,tmpPt2.y+@m_PixelWinSize*2,0);
                tmpPt4=Geom:oint3d.new(tmpPt3.x-@m_PixelWinSize*2,tmpPt3.y,0);
                tmpOsMode=@mSystemObj.getKeyValue("OsMode").to_i;
                #判断是否设置绘制模式
                if (tmpOsMode>0)       
                        pts=[tmpPt1,tmpPt2,tmpPt3,tmpPt4];
                        view.draw2d(GL_LINE_LOOP,pts);
                end
                #绘制光标处文字
                options = {
                   :font => "Arial",
                   :size => 10,
                   :bold => true,
                   :align => TextAlignLeft,
                   :color => "red"
                 }
                 view.draw_text(tmpPt2, @m_PixelWinStr, options);
        end
        def drawViewLine(view,pos)
                view.line_width=3;
        view.drawing_color="red";
        if @m_PtArr.size>1
                view.draw_polyline @m_PtArr;
        end
        if @m_PtArr.size>0
                        view.draw_polyline(@m_PtArr.last,pos);
                end
        end
end
end
#Sketchup.active_model.select_tool Tzbm_Common::BaseMain_01KJ.new
puts("20190209")

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|01BIM社区 - 最专业的BIM技术交流平台 ( 渝ICP备15000873号 )

GMT+8, 2024-3-28 17:08 , Processed in 0.054107 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表