🌓
搜索
 找回密码
 立即注册

SketchUp实战之HtmlDialog

练少爷 2022-8-24 11:37:44 74909

HTML网页UI

在上一章节中,我们学习了消息输入对话框可以实现简单的人机交互

如果我们想要在SketchUp实现更为复杂,更为美观的界面,就需要使用HTML及javascript或者vue等技术。

在SketchUp中提供了两个创建HTML界面的接口

WebDialog与HtmlDialog

WebDialog现在已经不推荐使用

HtmlDialog需要在SketchUp2017版本以上使用

这两个类的作用与方法几乎一样

这里我们就HTMLDialog进行讲解

0 1、HtmlDialog介绍
HtmlDialog类允许您用Ruby创建HTML对话框并与之交互。这是在SketchUp中生成复杂的嵌入式UI的最佳方法,但通常确实需要HTML和JavaScript专业知识。

如果您只是简单地向用户显示网站,

请考虑使用#openURL,

它将在默认浏览器中而不是SketchUp中的对话框中向用户显示网页。

创建方法:

#initialize(properties) ⇒ HtmlDialog

这个方法用于创建一个新的Html界面

参数:

properties(Hash)— 包含新创建对话框的初始属性的哈希。

哈希选项(properties):

:dialog_title(字符串)

:preferences_key(字符串)

:scrollable(布尔值)

:resizable(布尔值)—默认值:true

:width(整数)—默认值:250

:height(Integer)-默认值:250

:left(整数)—默认值:0

:top(整数)—默认值:0

:min_width(整数)-默认值:0

:min_height(整数)-默认值:0

:max_width(整数)-默认值:-1

:max_height(整数)-默认值:-1

:style(整数)-默认值:UI :: HtmlDialog :: STYLE_DIALOG

在properties中:style有三种可选值:


UI::HtmlDialog::STYLE_DIALOG

UI::HtmlDialog::STYLE_WINDOW

UI::HtmlDialog::STYLE_UTILITY


在SketchUp中一般用默认的就行

代码示例:

dialog = UI::HtmlDialog.new(
{
  :dialog_title => "Dialog Example",
  :preferences_key => "com.sample.plugin",
  :scrollable => true,
  :resizable => true,
  :width => 600,
  :height => 400,
  :left => 100,
  :top => 100,
  :min_width => 50,
  :min_height => 50,
  :max_width =>1000,
  :max_height => 1000,
  :style => UI::HtmlDialog::STYLE_DIALOG
})
dialog.set_url("http://www.sketchup.com")
dialog.show

注意:

在SketchUp 2019之前,如果还存在:preference_key,则将忽略提供的:width和:height。要变通解决此错误,请在初始化对话框后使用#set_size。

0 2、HtmlDialog实战

上一章节我们用inputbox方法做了个简单的UI

现在我们用html来制作它

先来看一下效果:

nK9V7jjs98YVg5ak.jpg

在这部分中重点在于js与ruby后台的通信

js传值代码:

sketchup.confirm(data_arr); //数据传输到ruby后台

ruby接受数据代码:

dialog.add_action_callback("confirm") { |action, params|  
  # param即js传过来的值  
  create_cube(params)
}

上面主要通过confirm标识来通信,所以一定要保证前后端这个标识一致

完整代码

cube.html代码:

<html>
	<head>  
		<meta charset="UTF-8"/>
		<title>立方体工具title>
		
		<style>
			body{
				background-color: #f0f0f0;
				width: 230px;
				height: 200px;
			}
		style>
  head> 
	
	<body>
		<div>
			<div>长度:<input id="cd" type="text" value="1000">div><br/>
			<div>宽度:<input id="kd" type="text" value="1000">div><br/>
			<div>高度:<input id="gd" type="text" value="1000">div><br/>
			<div>材质:
			<select id="cz">
				<option value="red">redoption>
				<option value="yellow">yellowoption>
				<option value="purple">purpleoption>
			select>
			div>
		div>
		<div style="float: right; margin-right: 10px;">
			<input type="button" value="确定" onclick="confirm()">
			<input type="button" value="取消" onclick="cancel()">
		div>
	body>
	<script src="https://code.jquery.com/jquery-3.3.1.min.js">script>
	<script>
		function confirm(){
			var cd = $("#cd").val();
			var kd = $("#kd").val();
			var gd = $("#gd").val();
			var cz = $("#cz option:selected").text()
			var data_arr = [cd, kd, gd, cz]
			sketchup.confirm(data_arr); //数据传输到ruby后台
		}
		function cancel(){
			sketchup.cancel();
		}
	script>
html>

cube.rb代码:

class Cube
    def self.create_cube(input)
		model = Sketchup.active_model
		model.start_operation('Create Cube', true)
		# 创建信息输入框		
		#
		if input
			vue = [input[0].to_f.mm,input[1].to_f.mm,input[2].to_f.mm]
			v = vue.find{|v| v if v==0}
			# 判断输入值是否有效,messbox提示
			res = UI.messagebox("在输入的长、宽、高中存在不合法数值", MB_OK) if v
			return if res
			group = model.active_entities.add_group
		    entities = group.entities
			points = [
				Geom::Point3d.new(0,   0,   0),
				Geom::Point3d.new(input[0].to_f.mm, 0,   0),
				Geom::Point3d.new(input[0].to_f.mm, input[1].to_f.mm, 0),
				Geom::Point3d.new(0,   input[1].to_f.mm, 0)
			]
			face = entities.add_face(points)
			face.reverse! unless face.normal.samedirection? Z_AXIS 
		    face.pushpull(input[2].to_f.mm)
		    group.material = input[-1]
		end
		
		model.commit_operation
    end

    def self.create_dialog
		dialog = UI::HtmlDialog.new(
		{
		  :dialog_title => "立方体工具",
		  :preferences_key => "",
		  :scrollable => true,
		  :resizable => true,
		  :width => 260,
		  :height => 260,
		  :left => 100,
		  :top => 100,
		  :min_width => 50,
		  :min_height => 50,
		  :max_width =>1000,
		  :max_height => 1000,
		  :style => UI::HtmlDialog::STYLE_DIALOG
		})
		dialog.set_file File.join(File.dirname(__FILE__), 'cube_ui/cube.html')
		dialog.show
		dialog.add_action_callback("confirm") { |action, params|
		  # params即js传过来的值
		  create_cube(params)
		}
		dialog.add_action_callback("cancel"){
			dialog.close
		}
    end

end

这只是一个简单的demo,有了HtmlDialog方法可以做更复杂更漂亮的操作界面。

与本文关系不大

这章节更新的比较慢,因为最近很忙。恰好最近在做一个项目,看效果:

M64Dw128v8S3dw81.jpg

这个效果与立体工具插件无关,在这主要告诉大家在SketchUp中界面可以很丰富,主要是vue实现

感兴趣的小伙伴点击关注


往期推荐

扫一扫

0 回复

高级模式
游客
返回顶部