BaseMain_01KJ类
BaseMain_01KJ类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::DrawBase_01KJ.new;
#人机交互基本参数
@coordsLength=1000000.m;#坐标轴长度
@ip1= Sketchup::InputPoint.new
@ip2= Sketchup::InputPoint.new
@pt1=Geom::Point3d.new(0,0,0);
@pt2=Geom::Point3d.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="PixelWinSize";
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::Point3d.new;
@pt2=Geom::Point3d.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::Point3d
@mValueStr=@pt2.distance(tmpPt).to_s;
Sketchup.set_status_text @mValueStr, SB_VCB_VALUE
end
end
end
##更新光标尺寸
@mSystemObj.m_Key="PixelWinSize";
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;
@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;
@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
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;
tmpStrPt=tmpStr.split(",");
tmpPt=Geom::Point3d.new();
#单位
tmpArr=@mSystemObj.getSystemUnits();
#UI.messagebox tmpArr
p "长度格式和单位:"+tmpArr.to_s;
if tmpArr.class==Array
if tmpArr==
p "长度格式和单位(十进制,mm),按mm进行转换!";
tmpPt.x=tmpStrPt.to_f.mm;
tmpPt.y=tmpStrPt.to_f.mm;
tmpPt.z=tmpStrPt.to_f.mm;
elsif tmpArr==
#UI.messagebox 2
p "长度格式和单位(十进制,m),按m进行转换!";
tmpPt.x=tmpStrPt.to_f.m;
tmpPt.y=tmpStrPt.to_f.m;
tmpPt.z=tmpStrPt.to_f.m;
else
p "长度格式和单位(其他),按mm进行转换!";
tmpPt.x=tmpStrPt.to_f.mm;
tmpPt.y=tmpStrPt.to_f.mm;
tmpPt.z=tmpStrPt.to_f.mm;
end
else
tmpPt.x=tmpStrPt.to_f.mm;
tmpPt.y=tmpStrPt.to_f.mm;
tmpPt.z=tmpStrPt.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;
tmpStrPt=tmpStr.split(",");
tmpPt=Geom::Point3d.new();
#单位
tmpArr=@mSystemObj.getSystemUnits();
p "长度格式和单位:"+tmpArr.to_s;
if tmpArr.class==Array
if tmpArr==
p "长度格式和单位(十进制,mm),按mm进行转换!";
tmpPt.x=tmpStrPt.to_f.mm;
tmpPt.y=tmpStrPt.to_f.mm;
tmpPt.z=tmpStrPt.to_f.mm;
elsif tmpArr==
p "长度格式和单位(十进制,m),按m进行转换!";
tmpPt.x=tmpStrPt.to_f.m;
tmpPt.y=tmpStrPt.to_f.m;
tmpPt.z=tmpStrPt.to_f.m;
else
p "长度格式和单位(其他),按mm进行转换!";
tmpPt.x=tmpStrPt.to_f.mm;
tmpPt.y=tmpStrPt.to_f.mm;
tmpPt.z=tmpStrPt.to_f.mm;
end
else
tmpPt.x=tmpStrPt.to_f.mm;
tmpPt.y=tmpStrPt.to_f.mm;
tmpPt.z=tmpStrPt.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;
tmpStrPt=tmpStr.split(",");
#tmpLength=tmpStrPt.to_i.mm;
#单位
tmpArr=@mSystemObj.getSystemUnits();
p "长度格式和单位:"+tmpArr.to_s;
if tmpArr.class==Array
if tmpArr==
p "长度格式和单位(十进制,mm),按mm进行转换!";
tmpLength=tmpStrPt.to_f.mm;
elsif tmpArr==
p "长度格式和单位(十进制,m),按m进行转换!";
tmpLength=tmpStrPt.to_f.m;
else
p "长度格式和单位(其他),按mm进行转换!";
tmpLength=tmpStrPt.to_f.mm;
end
else
tmpLength=tmpStrPt.to_f.mm;
end
tmpAngleRelativeX=tmpStrPt.to_i.degrees;
tmpAngleRelativeXOY=tmpStrPt.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==
p "长度格式和单位(十进制,mm),按mm进行转换!";
mLength=text.to_f.mm;
elsif tmpArr==
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::Point3d.new(tmpPt.x-@m_PixelWinSize,tmpPt.y-@m_PixelWinSize,0);
tmpPt2=Geom::Point3d.new(tmpPt1.x+@m_PixelWinSize*2,tmpPt1.y,0);
tmpPt3=Geom::Point3d.new(tmpPt2.x,tmpPt2.y+@m_PixelWinSize*2,0);
tmpPt4=Geom::Point3d.new(tmpPt3.x-@m_PixelWinSize*2,tmpPt3.y,0);
tmpOsMode=@mSystemObj.getKeyValue("OsMode").to_i;
#判断是否设置绘制模式
if (tmpOsMode>0)
pts=;
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")
页:
[1]