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

01BIM社区

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2082|回复: 1

选择基础类:SelectClass

[复制链接]

149

主题

485

帖子

1901

积分

金牌会员

Rank: 6Rank: 6

积分
1901
发表于 2021-10-7 11:19:48 | 显示全部楼层 |阅读模式
本帖最后由 tzbm123456 于 2021-10-7 11:20 编辑

选择基础类:SelectClass
2021年10月07日


回复

使用道具 举报

149

主题

485

帖子

1901

积分

金牌会员

Rank: 6Rank: 6

积分
1901
 楼主| 发表于 2021-10-7 11:21:57 | 显示全部楼层
module Tzbm_Common
class SelectClass_01KJ
        Verson="3.0";
        DevelopCompany="重庆天筑比盟科技公司"
        Developer="李总";
        DevelopTime="2019.06.30";
        DevelopAddress="凤凰湾";       
        ###################################################################################################################################
        def self.getVerson
                return Verson;
        end


        def self.getDevelopCompany
                return DevelopCompany;
        end


        def self.getDeveloper
                return Developer;
        end


        def self.getDevelopTime
                return DevelopTime;
        end


        def self.getDevelopAddress
                return DevelopAddress;
        end
       
        ###################################################################################################################################
        attr_accessor :m_View,:m_Point1,:m_Point2,:m_Point3,:m_Point4,:m_PointList,:m_CenterPoint,:m_Radius,:m_Key;       
        attr_accessor :m_PixelWinSize;
        ###################################################################################################################################       
       
        def initialize()
                ### 长方形四点
                @m_Point1=Geom:oint3d.new(0,0,0);
                @m_Point2=Geom:oint3d.new(1.m,0,0);
                @m_Point3=Geom:oint3d.new(1.m,1.m,0);
                @m_Point4=Geom:oint3d.new(0,1.m,0);
               
                @m_PointList=[@m_Point1,@m_Point2,@m_Point3,@m_Point4];
                ### 园形中心点
                @m_CenterPoint=Geom:oint3d.new(0,0,0);
                ### 园形半径
                @m_Radius=0.5.m;
                @m_Key=0;
                ### 光标尺寸
                m_SV=Tzbm_Common::SystemVariableClass_01KJ.new();
                m_SV.m_Key="ixelWinSize";
                tmpSize=m_SV.getValue();
                if tmpSize.class==NilClass
                        @m_PixelWinSize=5;
                else
                        @m_PixelWinSize=tmpSize.to_i;
                end
                ### 当前激活视图
                @m_View=Sketchup.active_model.active_view;
        end
        #Function 1,已知某点空间坐标,返回穿越该点空间坐标对应的屏幕坐标点的所有实体,@m_PixelWinSize为光标大小参数
        def selectPoint3d(mPoint)
                if @m_PixelWinSize==0
                        tmpPickHelper=@m_View.pick_helper;
                        tmpScreenPt=@m_View.screen_coords(mPoint);
                        tmpPH=tmpPickHelper.do_pick(tmpScreenPt.x,tmpScreenPt.y);
                        tmpEnts=tmpPickHelper.all_picked;
                else
                        tmpPickHelper=@m_View.pick_helper;
                        tmpScreenPt=@m_View.screen_coords(mPoint);
                        tmpPt1=Geom:oint3d.new(tmpScreenPt.x-@m_PixelWinSize,tmpScreenPt.y-@m_PixelWinSize,0);
                        tmpPt2=Geom:oint3d.new(tmpPt1.x+@m_PixelWinSize*2,tmpPt1.y+@m_PixelWinSize*2,0);
                        num_picked = tmpPickHelper.window_pick(tmpPt1, tmpPt2, Sketchup:ickHelper:ICK_CROSSING);
                        tmpEnts=tmpPickHelper.all_picked;
                end
                tmpEnts.uniq!()
                #Sketchup.active_model.selection.add tmpEnts
                #UI.messagebox tmpEnts.size
                #UI.messagebox tmpEnts
                #UI.messagebox tmpEnts[0].description
               
                #UI.messagebox tmpPickHelper.count.times ;
                ###保留Edge、Face、Group、ComponentInstance
                tmpArr=Array.new();
                tmpEnts.each{|ent|
                        if ent.class==Sketchup::Edge
                                tmpArr.push(ent);
                        elsif ent.class==Sketchup::Face
                                tmpArr.push(ent);
                        elsif ent.class==Sketchup::Group
                                tmpArr.push(ent);
                        elsif ent.class==Sketchup::ComponentInstance
                                tmpArr.push(ent);
                        elsif ent.class==Sketchup::ConstructionLine
                                tmpArr.push(ent);
                        end
                }
                return tmpArr;
        end
        #Function 2,返回穿越@m_Point1点对应的屏幕坐标点的所有实体
        def selectPoint()
                tmpPoint=@m_Point1;               
                tmpArr=selectPoint3d(tmpPoint);
                return tmpArr;
        end
        #Function 3,已知两点空间坐标,返回穿越两点空间坐标对应的屏幕坐标点连线的所有实体
        def selectLineSegment(mPoint1,mPoint2)
                tmpPickHelper=@m_View.pick_helper;
                tmpScreenPt1=@m_View.screen_coords(mPoint1);
                tmpScreenPt2=@m_View.screen_coords(mPoint2);


                numX=(tmpScreenPt2.x-tmpScreenPt1.x).to_inch.ceil.abs;
                numY=(tmpScreenPt2.y-tmpScreenPt1.y).to_inch.ceil.abs;


                num=nil;
                if numX>numY
                        num=numX;
                else
                        num=numY;
                end
                tmpDeltaX=(tmpScreenPt2.x-tmpScreenPt1.x)/num;
                tmpDeltaY=(tmpScreenPt2.y-tmpScreenPt1.y)/num;
                tmpEnts=[];
                for i in 0...num
                        tmpX=tmpScreenPt1.x+tmpDeltaX*i;
                        tmpY=tmpScreenPt1.y+tmpDeltaY*i;
                        tmpPickHelper.do_pick(tmpX,tmpY);
                        arr=tmpPickHelper.all_picked;
                        tmpEnts+=arr
                end
                tmpEnts.uniq!;


                tmpArr=[];
                tmpEnts.each{|ent|
                        if ent.class==Sketchup::Edge or ent.class==Sketchup::Face or \
                                ent.class==Sketchup::Group or ent.class==Sketchup::ComponentInstance
                                        tmpArr.push(ent);
                        end
                }
                return tmpArr;
        end
        #Function 4,返回穿越@m_Point1和@m_Point2两点对应的屏幕坐标点连线的所有实体
        def selectLine()
                tmpPt1=@m_Point1;
                tmpPt2=@m_Point2;               
                tmpArr=selectLineSegment(tmpPt1,tmpPt2);
                return tmpArr;
        end
        #Function 5,返回穿越@m_PointList点数组对应的屏幕坐标点连线的所有实体
        def selectPolyLine()
                if (@m_PointList.class!=Array)
                        puts("@m_PointList.class=<"+@m_PointList.class.to_s+">,不为Array类型,返回false!");
                        tmpValue=false;
                elsif (@m_PointList.empty?)
                        puts("@m_PointList.为空数组,返回false!");
                        tmpValue=false;
                elsif (@m_PointList.size==1)
                        tmpPoint=@m_PointList[0];
                        tmpValue=selectPoint3d(tmpPoint);
                else
                        tmpValue=Array.new();
                        for i in 0...@m_PointList.size-1
                                tmpPt1=@m_PointList;
                                tmpPt2=@m_PointList[i+1];
                                tmpArr=selectLineSegment(tmpPt1,tmpPt2);
                                tmpValue+=tmpArr;
                        end
                        tmpValue.uniq!;
                end
                return tmpValue;
        end
        #Function 6,返回穿越或包含于@m_PointList点数组对应的屏幕坐标点连线围合范围内的所有实体
        def selectArea()
               
        end
end
end
p "20190630"

回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2022-5-17 18:05 , Processed in 0.047093 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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