精华内容
下载资源
问答
  • SketchUp二次开发之鼠标工具 在SketchUp中,运用最多的就是鼠标事件,例如工具栏中的直线工具、矩形工具、圆弧工具等操作,都离不开鼠标事件。 在日常生活中我们常用鼠标事件有,单击左键,双击左键,右键,中键等。...

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

    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.new
      if @picked_first_ip.valid?
        Sketchup.status_text = '选择结束点'
      else
        Sketchup.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 = '选择结束点'
      else
        Sketchup.status_text = '选择开始点'
      end
      view.invalidate
    end
    

    onCancel

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

    def onCancel(view)
     @picked_first_ip.clear
      if @picked_first_ip.valid?
        Sketchup.status_text = '选择结束点.'
      else
        Sketchup.status_text = '选择开始点'
      end
     view.invalidate
    end
    

    onSetCursor

    设置光标

    def onSetCursor
      UI.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)
        end
        view.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 = 0
        if @picked_first_ip.valid?
          model = Sketchup.active_model
          model.start_operation('Edge', true)
          edge = model.active_entities.add_line(@points)
          num_new_faces = edge.find_faces
          model.commit_operation
          num_new_faces 
        end
        if num_new_faces > 0
          @picked_first_ip.clear
          Sketchup.status_text = '选择开始点'
        else
          @picked_first_ip.copy!(@mouse_ip)
        end
        if @picked_first_ip.valid?
          Sketchup.status_text = '选择结束点.'
        else
          Sketchup.status_text = '选择开始点'
        end
       view.invalidate
    end
    

    getExtents

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

    def getExtents
      bb = 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 @pints
      return unless @points.size == 2
      view.set_color_from_line(*@points)
      view.line_width = 1
      view.line_stipple = ''
      view.draw(GL_LINES, @points)
      @mouse_ip.draw(view) if @mouse_ip.display?
    end
    

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

    下期演示效果

    展开全文
  • Sketchup二次开发之利用Ruby绘制直线

    千次阅读 2017-04-19 13:56:14
    Sketchup二次开发之利用Ruby绘制直线 2013-03-16 19:41 by 精诚所至 金石为开, 1443 阅读, 0 评论, 收藏, 编辑 sketchup二次开发语言Ruby类由上至下分为APP,Model,Entities三大类,其中APP指的是...

    Sketchup二次开发之利用Ruby绘制直线

    2013-03-16 19:41 by 精诚所至 金石为开, 1443 阅读, 0 评论, 收藏, 编辑

    sketchup二次开发语言Ruby类由上至下分为APP,Model,Entities三大类,其中APP指的是Sketchup应用程序本身,Mode类指的是Sketchup模型文件,Entities类指各种实体,比如直线,圆弧等。向当前模型中添加实体的一般方法是先定义一个模型,ents=Sketchup.active_model.entities,取得当前模型的引用,然后利用entities的add方法添加各种实体。

    下列语句以原点位中心,在xoy平面上绘制一个五角星形图案。

    ents=Sketchup.active_model.entities
    pt1=[0,1,0]
    pt2=[0.588,-0.809,0]
    pt3=[-0.951,0.309,0]
    pt4=[0.951,0.309,0]
    pt5=[-0.588,-0.809,0]
    ents.add_line pt1,pt2
    ents.add_line pt2,pt3
    ents.add_line pt3,pt4
    ents.add_line pt4,pt5
    ents.add_line pt5,pt1

    运行效果如下图所示。

    sketchup-ruby

    添加一个直线还是很简单的。

    作者:codee
    文章千古事,得失寸心知。


    0
    0
    « 上一篇:Sketchup二次开发API之Command类
    » 下一篇:Sketchup二次开发之layer图层控制

    展开全文
  • Sketchup二次开发API之UI类

    千次阅读 2017-04-19 13:49:41
    Sketchup二次开发API之UI类 2013-03-14 20:51 by 精诚所至 金石为开, 1586 阅读, 0 评论, 收藏, 编辑 UI及User interface,指应用程序Sketchup本身,可以通过add_context_menu_handler方法在sketchup中...

    Sketchup二次开发API之UI类

    2013-03-14 20:51 by 精诚所至 金石为开, 1586 阅读, 0 评论, 收藏, 编辑

    UI及User interface,指应用程序Sketchup本身,可以通过add_context_menu_handler方法在sketchup中添加上下文菜单,基本语法如下。

    UI.add_context_menu_handler do |context_menu|
      context_menu.add_separator
      context_menu.add_item("Hello World") {
        UI.messagebox("Hello world")
      }
    end

    并菜单添加一个命令函数。

    利用inputbox命令创建用户界面,接受用户输入信息,创建用户交互内容,基本语法如下。

    prompts = ["宽度", "高度", "标高"]
    defaults = ["630", "320", "2000"]
    list = ["100|120|200|250|300|320|400|450|500|630", "100|120|200|250|300|320|400|450|500", ""]
    input = UI.inputbox prompts, defaults, list, "风管参数设定"

    利用inputbox可以创建跟Revit中工具上下文状态栏,比如,绘制风管时由用户设定风管大小和标高等。貌似输入框要么接受用户输入,要么用list事先设定可能的值,但是无法既能接受用户输入,又添加预定值,不太方便。

    UI类的menu命令用来向顶部菜单栏中添加菜单项,基本语法如下。

    tool_menu = UI.menu "Tools"
    tool_menu.add_item("Cheese Tool") {
      status = UI.openURL "
    http://www.sketchup.com"
    }

    UI.openURL方法用来打开一个网页。

    作者:codee
    文章千古事,得失寸心知。
                 关注我 收藏该文      
    0
    0
    « 上一篇:Sketchup二次开发API之Toolbar类
    » 下一篇:Sketchup二次开发API之Command类


    展开全文
  • 当我们明白他们运行原理,就可以开始使用代码来进行SketchUp扩展程序开发了。 这里我们来看看第一种数据结构SketchUp,它是一个模块,与我们在编程中接触到的类比较相似。后面我们将讨论模块的详细细节,现在我们只...

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

    SketchUp模块介绍及使用

    SketchUp模块

    几乎所有的SketchUp开始都会访问三种基本的数据结构:SketchUp、Model和Entities。当我们明白他们运行原理,就可以开始使用代码来进行SketchUp扩展程序开发了。
    这里我们来看看第一种数据结构SketchUp,它是一个模块,与我们在编程中接触到的类比较相似。后面我们将讨论模块的详细细节,现在我们只需要知道模块包含了一系列的方法及可以了。
    SketchUp模块的方法访问属性涉及到SketchUp整个应用。我们来查看它如何运行的。

    Ruby控制台

    启动SketchUp,打开菜单栏中【窗口】中的【Ruby控制台】,如下图:
    控制台

    SketchUp方法

    我们打开Ruby for SketchUp API 会发现在Sketchup模块下有很多的子模块、类及方法。在这里我们来看看在Ruby控制台中方法的调用。
    如我们要查看当前SketchUp的版本号,我们则在控制台输入Sketchup.version,将会显示SketchUp的当前版本:
    版本查看
    我们也可以输入Sketchup.os_language查看当前的语言或者使用Sketchup.get_locale查看应用的安装路径。
    如果想查看所有的方法可以使用Sketchup.methods。
    在Sketchup中最重要的一个方法是active_model,该方法返回当前我们所有的设计模型对象,下面是代码的使用实例:
    model = Sketchup.active_model

    Model对象

    前面说了Sketchup模块涉及了整个SketchUp的应用,Model对象就代表了一个独立的SketchUp文件(*.skp),更准确的说是所有文件中的设计信息。当我们在SketchUp中打开一个文件时,所有的Sketchup模块的属性都是相同的,但是在活动的Model对象中都是一样的。
    Model类中的方法提供关于当前设计的所有信息。
    例如modified?方法是用来检测最后一次保存的文件是否有修改过。调用方法如下:

    model = Sketchup.active_model
    model.modified?
    

    还有title方法返回当前设计的标题,description方法返回当前的文本描述,path方法返回当前设计文件的路径。还有一系列关于Model类的方法。
    这些方法我大都使用来访问当前设计的对象容器。我们可以将Model当做一个容器。在这个容器对象中包含了许多的子容器对象,子容器对象又包含了许多的容器对象。如下图:
    model对象容器
    在Model容器中包含了六个子容器,在后面的章节中会一一介绍各个子容器对象。

    代码案例分析

    代码编辑器

    在这里给新手推荐一款很好用的编辑器【Ruby Code Editor】,这款代码编辑器插件也是一位前辈开发的。
    下载地址:http://pan.baidu.com/s/1ADdcM
    安装方法:我们下载下来是以.rbz结尾的插件形式,可以直接打开SketchUp的【扩展程序管理器】安装扩展程序。

    代码案例

    今天我们来看一下SketchUp官网中的一张图片,在这里我们将对以下代码进行剖解分析
    示例效果
    代码如下:

    model = Sketchup.active_model
    selection = model.selection.to_a
    faces = selection.grep(Sketchup::Face)
    faces.each do |face|
      face.pushpull(rand(20))
    end
    

    这里总共6句代码,其主要完成的功能是对选中的面进行一个随机值20以内的推拉操作。
    第1句主要是获取当前所有设计模型对象;
    第2句中返回选中的模型对象并且转换成数组;
    第3句中获取到当前数组中所有的面数组;
    最后each循环获取到的所有faces,对每个face执行pushpull操作。
    rand(20)是获取一个20以内的随机数。

    关注公众号

    ruby for sketchup
    关注我了解更多

    展开全文
  • Command类是Sketchup二次开中一个重要的类别,用来向Sketchup添加插件的核心代码,基本用法如下。 cmd = UI::Command.new(""){ UI.messagebox("My Command") } cmd.menu_text = "My ...
  • 将图元添加成组,方便使用和调整,基本语句如下。 face=Sketchup.active_model.entities.add_face [1,0,0],[1,1,0],[0,1,0],[0,0,0] ... face.pushpull 1 gp=Sketchup.active_model.entities.add_group face.all...
  • 利用Ruby语句控制Sketchup的图层设置,包括图层显示,图层设置等,可以使用简洁语句添加一个图层,下面语句添加一个名称为”test_layer“的图层。 new_layer=Sketchup.active_model.layers.add “test_layer” ...
  • 然后添加一个Commad命令,也就是创建一个函数,用来当工具栏中图标来引用,并设置Commad的图标,及工具提示和激活时Sketchup状态栏显示的信息,然后用add_item方法将命令添加到toolbar中,最后一据toolbar.show,让...
  • SketchUp + Ruby 二次开发初识

    千次阅读 2018-03-13 17:30:07
    Sketchup二次开发、插件、ruby
  • SketchUp Ruby二次开发

    2020-06-15 16:57:10
    Sketchup Ruby 基础-安装 安装环境Ruby下载Ruby安装调试写在最后图片显示 安装环境 本次教程仅针对windows10系统。 Ruby下载 对于ruby下载时一定需要注意,必须下载rubyinstaller with devkit版本。因为后期在对...
  • 一、Sketchup用ruby进行二次开发--简述

    千次阅读 2017-04-19 13:42:37
    一、Sketchup用ruby进行二次开发--简述 标签: rubySketchup二次开发 2014-07-17 15:56 2370人阅读 评论(2) 收藏 举报 本文章已收录于: 分类: Sketchup+ruby开发(6) 作者...
  • 在初识 SketchUp 的 Ruby Code Editor之后, 我们学会了6行代码绘制球体。 但是这不是一个 完整 的插件, 在使用的时候还需要打开 Ruby Code Editor, 粘贴我们的球体代码执行。 那这次我们的 目标 是: 把我们的...

空空如也

空空如也

1 2 3 4
收藏数 64
精华内容 25
关键字:

sketchup二次开发