微信公众号:老顽童与小东邪
关注可了解更多的教程及排版技巧。问题或建议,请公众号留言;
如果你觉得对你有帮助,欢迎赞赏

SketchUp二次开发之鼠标工具

在SketchUp中,运用最多的就是鼠标事件,例如工具栏中的直线工具、矩形工具、圆弧工具等操作,都离不开鼠标事件。

在日常生活中我们常用鼠标事件有,单击左键,双击左键,右键,中键等。当然在Tool对象中也提供了这些方法。

onLButtonDown-按下鼠标左键

onLButttonUp-释放鼠标左键

onLButtonDoubleClick-双击鼠标左键

onRButtonDown-按下鼠标右键

onRButtonUp-释放鼠标右键

onMouseMove-移动鼠标

其中使用频率较高的有onLButtonDown、onLButttonUp、onRButtonDown、onRButtonUp、onMouseMove等方法。

onMouseMove方法

每当我们移动鼠标时,SketchUp就会调用onMouseMove方法。
Examples:

def onMouseMove(flags, x, y, view)puts "onMouseMove: flags = #{flags}"puts "                  x = #{x}"puts "                  y = #{y}"puts "               view = #{view}"
end

参数:

flags (Integer) — 记录鼠标状态

x (Integer) — 鼠标事件发生时在屏幕的X坐标

y (Integer) — 鼠标事件发生时在屏幕的Y坐标

view (Sketchup::View) — 视图

onLButtonDown方法

当我们按下鼠标左键时,SketchUp就会调用onLButtonDown方法。

Examples:

def onLButtonDown(flags, x, y, view)puts "onLButtonDown: flags = #{flags}"puts "                   x = #{x}"puts "                   y = #{y}"puts "                view = #{view}"
end

参数意义与上文相近。在SketchUp中大多数工具中都会使用到这个方法。

是不是觉得很抽象
下面我们结合例子来理解

铅笔工具

大家跟着我来实现一个简单的铅笔工具吧
我们先来回顾下上一章节的lwt_load.rb文件内容

加载代码

path = File.dirname(__FILE__).force_encoding('utf-8')
files = [File.join(path, 'lwt_plug/sphere.rb')
]
files.each{|file|next unless File.file?(file)load file
}# 新增工具条
menu = UI.menu('Extensions')
toolbar = UI::Toolbar.new "老顽童工具条"
cmd = UI::Command.new("create_sphere"){LWT.create_sphere # 调用创建球体插件
}
cmd.large_icon = cmd.small_icon = "lwt_plug/image/toolSphere.png"
cmd.tooltip = "创建球体"
cmd.status_bar_text = "这是创建球体的插件"
toolbar.add_item cmd
toolbar.show
menu.add_item cmd

我们现在将这个铅笔工具添加到这个工具栏中

1、去lwt_plug文件夹中新建一个pen_tool.rb文件。

2、然后修改lwt_load.rb文件

# 在files数组中追加一条铅笔工具目录
files = [File.join(path, 'lwt_plug/sphere.rb'),File.join(path, 'lwt_plug/pen_tool.rb'),
]# 在工具条新增一个铅笔工具命令
pen_cmd = UI::Command.new("pen_tool"){UI.messagebox('此处调用铅笔工具')   # 此处调用铅笔工具插件
}
pen_cmd.large_icon = pen_cmd.small_icon = "lwt_plug/image/toolPen.png"
pen_cmd.tooltip = "铅笔工具"
pen_cmd.status_bar_text = "这是铅笔绘制工具"
toolbar.add_item pen_cmd

我们保存代码,看下效果:

能看到这个效果,标识我们已经将铅笔工具加载到了工具条。

重点来了

主要功能将会在pen_tool.rb文件中实现。在这个功能中我们将会用到onMouseMove及onLButtonDown方法。还会用到Tool模块下的方法有:

activate - 当工具被选择后,SketchUp就会调用该方法,一般放置实例变量在这个方法中。例如:鼠标状态等

deactivate - 当我们释放该工具时会调用该方法

resume - 当工具在暂停后再次激活时,SketchUp会调用该方法

onCancel - 当我们在做一些撤销操作时,该方法会在被执行撤销之前被调用

onSetCursor - 当工具需要设置光标时,SketchUp会调用该方法

getExtents - 为了准确的绘制图形时,SketchUp需要通过该方法知道其绘制范围

draw - 该方法是在绘制前用于预览的效果

来看一下code

activate

在这个方法中我们设置两个鼠标点变量,并设置状态栏提示信息

def activate@mouse_ip = Sketchup::InputPoint.new@picked_first_ip = Sketchup::InputPoint.newif @picked_first_ip.valid?Sketchup.status_text = '选择结束点'elseSketchup.status_text = '选择开始点'end
end

deactivate

当我们释放工具时,刷新SketchUp视图

def deactivate(view)view.invalidate   #  刷新Sketchup视图
end

resume

当工具再次激活是,刷新状态栏提示信息。

def resume(view)if @picked_first_ip.valid?Sketchup.status_text = '选择结束点'elseSketchup.status_text = '选择开始点'endview.invalidate
end

onCancel

清除当前变量值,刷新视图界面

def onCancel(view)@picked_first_ip.clearif @picked_first_ip.valid?Sketchup.status_text = '选择结束点.'elseSketchup.status_text = '选择开始点'endview.invalidate
end

onSetCursor

设置光标

def onSetCursorUI.set_cursor(632)  # 这里632是软件自带的铅笔光标
end

onMouseMove

当鼠标在移动过程中获取鼠标位置信息

def onMouseMove(flags, x, y, view)if @picked_first_ip.valid?@mouse_ip.pick(view, x, y, @picked_first_ip)else@mouse_ip.pick(view, x, y)endview.tooltip = @mouse_ip.tooltip if @mouse_ip.valid?view.invalidate
end

onLButtonDown

判断第一个点是否有效,如果有效,我们就添加一条线,检索这条边构成面的个数

如果面的个数大于0,说明线与线有交叉,清除第一个鼠标点,

否则将移动的点复制给@picked_first_ip。

def onLButtonDown(flags, x, y, view)num_new_faces = 0if @picked_first_ip.valid?model = Sketchup.active_modelmodel.start_operation('Edge', true)edge = model.active_entities.add_line(@points)num_new_faces = edge.find_facesmodel.commit_operationnum_new_faces endif num_new_faces > 0@picked_first_ip.clearSketchup.status_text = '选择开始点'else@picked_first_ip.copy!(@mouse_ip)endif @picked_first_ip.valid?Sketchup.status_text = '选择结束点.'elseSketchup.status_text = '选择开始点'endview.invalidate
end

getExtents

将所有的有效点存在points数组中,然后将这些点放入新建的boundingbox对象中。以便我们在视图中更好的观察到。

def getExtentsbb = Geom::BoundingBox.new@points = []@points << @picked_first_ip.position if @picked_first_ip.valid?@points << @mouse_ip.position if @mouse_ip.valid?bb.add(@points)bb
end

draw

在绘制线段之前,我们先把效果预览出来。即符合所见即所得的思想。

def draw(view)return unless @pintsreturn unless @points.size == 2view.set_color_from_line(*@points)view.line_width = 1view.line_stipple = ''view.draw(GL_LINES, @points)@mouse_ip.draw(view) if @mouse_ip.display?
end

结束
喜欢关注公众号【老顽童与小东邪】获取更多教程

下期演示效果

SketchUp二次开发之鼠标工具相关推荐

  1. [arcgis插件]gis二次开发 报备工具:SHP转TXT文本、TXT转SHP插件

    [arcgis插件]gis二次开发 报备工具:SHP转TXT文本.TXT转SHP插件 [2022.09.28版本更新] 1.shp转txt文件: 选择图层:选择面图层 保存路径:设置一个文件夹路径,可 ...

  2. 极简工具,Tekla二次开发--构件图标注工具

    第三篇:Tekla二次开发--极简工具,构件图标注工具 关于极简工具 功能介绍 以下是功能视频节选 完整的视频演示地址 C# Tekla二次开发开发教学视频 关于极简工具 Tekla和AutoCAD二 ...

  3. VSTO Office二次开发键盘鼠标钩子使用整理

    VSTO Office二次开发键盘鼠标钩子使用整理 可能通过程序控制键盘的操作和控制鼠标的一些操作,网上提供比较多的也是比较好的就是通过钩子(Hook)的方式实现. 简单整理了一下,没有找到很好的程序 ...

  4. Navisworks API 简单二次开发 (自定义工具条)

    在Navisworks软件运行的时候界面右侧有个工具条.比较方便.但是在二次开发的时候我不知道在Api那里调用.如果有网友知道请告诉我.谢谢. 我用就自己设置一个工具.界面比较丑!没有美工. 代码: ...

  5. QGIS二次开发:鼠标在地图上移动时,状态栏显示鼠标所在位置经纬度

    主要思路: 当鼠标在地图画布控件上移动时,会发送xyCoordinates信号,该信号参数是墨卡托坐标系表示的地图上的点坐标,然后将墨卡托坐标转为经纬度表示的WSG84坐标,绑定该信号到槽函数,然后发 ...

  6. python二次开发bim软件_BIM软件的二次开发有哪些工具?API工具你用过吗?

    今天跟大家聊一聊api二次开发的问题,在传统的CAD软件或者现有的BIM软件都涉及到一个软件内核的问题.因为内核软件多由外国开放的,针对该软件所适应的设计规范往往都是内置了外国的设计规范,而国内不能过 ...

  7. SketchUp二次开发模块介绍及使用

    微信公众号:老顽童与小东邪 关注可了解更多的教程及编程技巧.问题或建议,请加好友留言; 如果你觉得对你有帮助,欢迎赞赏 SketchUp模块介绍及使用 SketchUp模块 几乎所有的SketchUp ...

  8. VSC# ArcGIS 二次开发--出图工具:添加图名、比例尺、指北针、图例,导出图片或文件、打印地图

    这是我们GIS课程的结课作业,只能说,大心血 链接在最后,但是还是希望大家可以看看代码,可以留言相互交流学习. 目录 链接在最后,但是还是希望大家可以看看代码,可以留言相互交流学习. 添加图名 指北针 ...

  9. Revit二次开发小火车工具集的复现

    这是复现了腿腿教学网麻蛋讲师所做的小火车工具集插件的代码.下面是Github的链接有需要可以下载. https://github.com/yingdajun/BabyTrainCopyDemo

最新文章

  1. ORACLE11g 没有控制文件如何通过rman备份恢复数据的详细实战过程
  2. 详细说说Transformer (超详细图解,一图胜千言)
  3. NAACL19笔记:自然语言处理应用的实用理解(多图解链接)
  4. winpcap基本原理及常见应用_数字图像处理原理及应用教学大纲
  5. winscp登陆windows服务器_基于OpenSSH+WinSCP完成Windows服务器之间的文件传输
  6. html页面js遍历listview,javascript实现的listview效果
  7. WebSite和Web Application\网站与Web项目的区别
  8. qt 实现拖动矩形角度_PPT技巧应用—利用PPT的遮罩效果来实现文字的炫彩变化
  9. POJ1273 裸裸的网络流
  10. spring源码-第五个后置处理器笔记
  11. iOS实例、类、元类
  12. 电大系统服务器的性能测试报告表,湖南电大校教职工绩效管理系统的设计与实现...
  13. 特殊符号大全分享给大家,直接复制粘贴就可以使用了!
  14. kindle的xray怎么用_kindle的x-ray有什么用
  15. APK安装流程:点击下载应用了解安装的全过程
  16. 【C语言】使用Qt5学习C语言编写Hello World
  17. MyBatis条件查询
  18. 《朝歌封神录》10.22正式上线链游玩家|山海异闻、奇幻仙侠
  19. 不改变像素尺寸怎么压缩图片
  20. 中学-知识与能力【9】

热门文章

  1. QQ音乐JS逆向爬虫,我用python全都爬!
  2. Android最新手机号正则判断(含最新166/198/199开头的手机号)
  3. 思科无线AP配置之一(使用超级终端连接设备篇)
  4. sca标准值_如何制造符合精品咖啡协会SCA标准的矿物水?
  5. ttest函数使用方法_用MATLAB做T检验(ttest)
  6. 百度文库和豆丁文库的外链推广技巧差异性分析【唯有网络】
  7. 用C++写好一个基本的文本编辑软件
  8. Java图形化界面编程超详细知识点(7)——进度条
  9. WinCC 使用VBS脚本操作变量、控件总结
  10. 使用运动控制卡,卡顿、蓝屏了怎么办?优易控提供更高级的解决方案