Su二次开发--墙面竖向龙骨的生成

g = Sketchup.active_model.selection[0]
gps = g.entities.grep(Sketchup::Group)
gp1 = gps.find{|gp| gp.get_attribute("DFC_AN_ZsggTool","构件群组") == "竖骨线组"}
path_hash = {
  s_sk_path:      File.expand_path("../曲面竖向龙骨.skp", __FILE__)
}
hash.merge!(path_hash)
class A
  # 初始化方法
  def initialize(g,gp1,hash)
    @g = g
    @gp1 = gp1    @hash = hash
  end
  # 竖向龙骨方法
  def skeel
    definitions = Sketchup.active_model.definitions
     d = definitions.load @hash[:s_sk_path]
     d_depth = d.bounds.depth
    if @hash["墙类型"] == "平形"
       mypt = @mg.entities.add_cpoint ORIGIN
      @gp1.entities.each{|e|
          need_df_name = get_SLG_df_name(e)
          need_df = definitions.find{|df| df.name==need_df_name}
           pt = e.vertices.sort_by{|v| v.position.z}.map(&:position).first
           pt.offset!(@f_normal.reverse,d_depth/2)
          if need_df.nil?
            need_df = get_SLG_defintion(e, d, definitions)
          end
          @mg.entities.add_instance need_df,pt
      }
      @mg.entities.erase_entities mypt
    elsif @hash["墙类型"] == "弧形"
        mypt = @mg.entities.add_cpoint ORIGIN
        @gp1.entities.each{|e|
          need_df_name = get_SLG_df_name(e)
          need_df = definitions.find{|df| df.name==need_df_name}
           pt,pt_ = e.vertices.sort_by{|v| v.position.z}.map(&:position)
           vec = e.get_attribute("线","方向")
           pt.offset!(vec,d_depth/2)
            if need_df.nil?
            need_df = get_SLG_defintion(e, d, definitions)
          end
          copins = @mg.entities.add_instance need_df,pt
          fz_vec = X_AXIS.reverse.transform copins.transformation  #凹口向量
          circle_vec = e.get_attribute("线","方向")                #龙骨朝向圆心的向量
          angle = fz_vec.angle_between circle_vec
          face = d.entities.grep(Sketchup::Face).first
           c_p = face.bounds.center.transform copins.transformation
          t1 = Geom::Transformation.rotation c_p, Z_AXIS, angle
          t1 = Geom::Transformation.rotation c_p, Z_AXIS.reverse, angle if not (circle_vec.samedirection? fz_vec.transform t1)
          copins.transform! t1
      }
        @mg.entities.erase_entities mypt
    elsif @hash["墙类型"] == "倒弧形"
        edges = @gp1.entities.select{|ent| ent.typename == "Edge"}  #竖线组竖线
        slg_edges = get_Sorted_edges(edges)
        slg_edges.each{|e|
          need_df_name = get_SLG_df_name(e)
          need_df = definitions.find{|df| df.name==need_df_name}
          pts = get_pts e
          bp = pts.sort_by{|p| p.z}.first
         if need_df.nil?
            need_df = get_SLG_defintion(e, d, definitions)
          end
          @mg.entities.add_instance need_df, bp
        }
    end
  end
 #获取竖龙骨的定义的名字
  def get_SLG_df_name(e)
       if @hash["墙类型"] == "平形"||@hash["墙类型"] == "弧形"
         sum_l = e.length
         sum_l_s = sum_l.to_mm.to_i.to_s
         return sum_l_s+"_para_SLG"
       elsif @hash["墙类型"] == "倒弧形"
        sum_l = e.map(&:length).inject(:+)
        sum_l_s = sum_l.to_mm.to_i.to_s
        if e.length > 1
          ed0 = e.first
          v0, v1 = ed0.vertices
          ed1 = e.find{|ed| ed.vertices.include?(v0) && ed!=ed0}
          if ed1
            common_v = v0
          else
            ed1 = e.find{|ed| ed.vertices.include?(v1) && ed!=ed0}
            common_v = v1
          end
          v0,v1 = [ed0,ed1].map{|ed| ed.vertices.find{|v| v != common_v}}
          common_p, v_p0, v_p1 = [common_v, v0, v1].map(&:position)
          angle = (common_p.vector_to v_p0).angle_between (common_p.vector_to v_p1)
          angle_s = angle.round(2).to_s
        else
          angle_s = "0"
        end
        return sum_l_s+"_"+angle_s+"_arc_SLG12"
        end
      end

  #获取竖龙骨新的定义
  def get_SLG_defintion(e, d, definitions)
    need_df = definitions.add(get_SLG_df_name(e))
     if @hash["墙类型"] == "平形"||@hash["墙类型"] == "弧形"
        need_df.description = "平行墙竖向龙骨"
        copins = need_df.entities.add_instance(d,ORIGIN)
        pt, pt_ =  e.vertices.sort_by{|v| v.position.z}.map(&:position)  #获取底部的点
        vec = pt.vector_to pt_
        face = d.entities.grep(Sketchup::Face).first
        f_normal = face.normal.transform copins.transformation
        c_p = face.bounds.center.transform copins.transformation
        angle = f_normal.angle_between vec
        t0 = Geom::Transformation.rotation c_p, Y_AXIS, angle
        t0 = Geom::Transformation.rotation c_p,Y_AXIS.reverse, angle if not (vec.samedirection? f_normal.transform t0)
        copins.transform! t0
        fz_vec = Z_AXIS.transform copins.transformation         #凹口向量
        angle = fz_vec.angle_between @f_normal                  #墙面向量
        t1 = Geom::Transformation.rotation c_p, Z_AXIS, angle
        t1 = Geom::Transformation.rotation c_p, Z_AXIS.reverse, angle if not (@f_normal.samedirection? fz_vec.transform t0)
        copins.transform! t1 if @hash["墙类型"] == "平形"
        face = copins.explode.find{|e|e.typename=="Face"}
        face.pushpull e.length
        need_df.set_attribute("方向",e.get_attribute("线","方向"))
        return need_df    

        elsif @hash["墙类型"] == "倒弧形"
        pts = get_pts e
        bp = pts.sort_by{|p| p.z}.first
        copins = need_df.entities.add_instance d,ORIGIN #放进小组中
        bp_= pts.sort_by{|p| p.z}[1]
        bp_ed = e.find{|ed| ps = ed.vertices.map(&:position); ps.include?(bp) && ps.include?(bp_)}
        vec_0 = bp.vector_to bp_
        face = d.entities.grep(Sketchup::Face).first
        f_normal = face.normal.transform copins.transformation
        c_p = face.bounds.center.transform copins.transformation
        angle = f_normal.angle_between vec_0
        z_vec = vertical_vec_for_2vec(f_normal, vec_0) #两向量的法向量
        trs = Geom::Transformation.translation [0,0,-d.bounds.depth*0.5]
        trs0 = (Geom::Transformation.rotation c_p, z_vec, angle)
        trs0 = (Geom::Transformation.rotation c_p, z_vec.reverse, angle) if not (f_normal.transform trs0).samedirection? vec_0
        copins.transform! trs0*trs
        fz_vec = Z_AXIS.reverse.transform copins.transformation #凹口向量
        vec_1 = bp_ed.get_attribute "线","方向"                #龙骨朝向圆心的向量
        angle = (fz_vec.angle_between vec_1)
        trs1 = Geom::Transformation.rotation c_p, vec_0, angle
        trs1 = (Geom::Transformation.rotation c_p, vec_0.reverse, angle) if not (fz_vec.transform trs1).samedirection? vec_1
        copins.transform! trs1
        face = copins.explode.find{|e|e.typename=="Face"}
        face.reverse! if face.normal.samedirection? vec_0
        path = need_df.entities.add_edges pts.map{|pt| pt.transform (bp.vector_to ORIGIN)}
        face.followme path
        need_df.entities.erase_entities path
        need_df.entities.grep(Sketchup::Edge).select{|ed| ed.soft = true if ed.length == @hash["竖骨宽"]}
        need_df.set_attribute "竖骨", "方向", vec_1
        return need_df
        end
        end
   #获得一组一组的连接的线
    def get_Sorted_edges(edges)
        bord_eds = edges.select{|ed| (edges-[ed]).select{ |ed_| common_pt(ed, ed_) }.length == 1}  #多条边相连
          x_eds_arr = []                                #存放各个temp_arr
          @use_eds = []                                 #放置已经使用过的edge
          bord_eds.each do |ed|                         #求与ed相连的一串edges, 放于temp_arr
          next if @use_eds.include?(ed)
          @use_eds.push ed
          temp_arr = [ed]
          start_ed = ed
          while 1 do
          con_edge = ([email protected]_eds).find{|ed_| common_pt(start_ed, ed_)}
          if con_edge.nil?
            break
          else
            @use_eds.push con_edge
            temp_arr.push con_edge
            start_ed = con_edge
          end
          end
          x_eds_arr.push temp_arr                       #x_eds_arr中存放一个个的竖线组
        end
        return x_eds_arr
    end

  #获取两个向量之间的法向量
  def vertical_vec_for_2vec(vec1, vec2)
    raise "Error: 两向量平行" if vec1.parallel? vec2
    x1,y1,z1 = vec1.to_a
    x2,y2,z2 = vec2.to_a
    x, y, z  = (y1*z2-y2*z1),(z1*x2-z2*x1),(x1*y2-x2*y1)
    return Geom::Vector3d.new(x, y, z)
  end
 def common_pt(ed1,ed2)
    ed1.vertices.map(&:position).find{|pt| ed2.vertices.map(&:position).include?(pt)}  end
  def get_pts(edges)
    pts = []
    pts << edges.first.vertices.reject{|pt| true if pt.position == common_pt(edges.first,edges[1])}.first.position
    edges.each{|e| e.vertices.each{|v| pts << v.position if (!pts.include?(v.position))}}
    pts
  end
  def combination
   group_SLG = skeel
  end
end
Sketchup.active_model.start_operation ""
A.new(g,gp1,gp2,gp_mesh, gp1_face, hash).combination
Sketchup.active_model.commit_operation

  

原文地址:https://www.cnblogs.com/zhongshengdong/p/8930906.html

时间: 2024-09-30 20:40:02

Su二次开发--墙面竖向龙骨的生成的相关文章

FreeCAD二次开发-Part.Shape合并几何元素,生成拓扑形状

from FreeCAD import Base # 点坐标 V1 = Base.Vector(0,10,0) V2 = Base.Vector(30,10,0) V3 = Base.Vector(30,-10,0) V4 = Base.Vector(0,-10,0) VC1 = Base.Vector(-10,0,0) VC2 = Base.Vector(40,0,0) # 创建圆弧 C1 = Part.Arc(V1,VC1,V4) C2 = Part.Arc(V2,VC2,V3) # 创建直

【流媒体开发】VLC Media Player - Android 平台源码编译 与 二次开发详解 (提供详细800M下载好的编译源码及eclipse可调试播放器源码下载)

作者 : 韩曙亮  博客地址 : http://blog.csdn.net/shulianghan/article/details/42707293 转载请注明出处 : http://blog.csdn.net/shulianghan VLC 二次开发 视频教程 : http://edu.csdn.net/course/detail/355 博客总结 : -- 本博客目的 : 让 Android 开发者通过看本博客能够掌握独立移植 VLC Media Player 核心框架到自己的 app 中,

微控工具xp模块-开发版[微信(wechat)二次开发模块]

http://repo.xposed.info/module/com.easy.wtool 微控工具xp模块-开发版[微信(wechat)二次开发模块] 基于xposed框架的微信二次开发模块,方便开发者用微信做一些扩展功能(如微信群发.多群直播等...) 目前支持功能: 发文本消息 发图片消息 发语音消息 发视频消息 获取微信好友列表 群列表 支持群发消息 支持消息转发(目前支持文本.图片.语音.视频.图文消息转发) 群管理功能(建群.加人.踢人.设置公告.改群名.退群.解散群) [注:本模块

浅析PHP的开源产品二次开发的基本要求

浅析PHP的开源产品二次开发的基本要求 第一, 基本要求:HTML(必须要非常熟悉),PHP(能看懂代码,能写一些小系统,如:留言板,小型CMS),Mysql(至少会一种数据库),Javascript(能看懂,能改现成的一些代码),Div+Css(能进行界面的调整,明白CSS是怎么使用的) 第二, 熟悉开源产品的使用,比如 Dedecms,你要知道怎么登录,怎么新建栏目,怎么添加文章,模板标签的使用方法,模型的概念和使用方法等等一些功能 第三, 要熟悉这个开源产品的数据库结构,还要理解里面核心文

通达OA 二次开发培训第二讲

本次是通达OA二次开发第二讲,主要介绍了如何在通达OA中进行程序开发,并将开发程序挂接到OA系统中.

xshell远程终端操作Ubuntu server安装LAMP环境之最详细笔记之二PHP开发环境配置

前言: 昨天学会了安装server,今天试着通过远程终端xshell来安装LAMP,搭配一下开发环境,也有集成环境可以一键安装使用,还是瞎折腾一下,手动一步一步搭建一下这个开发环境. 接上一篇:ubuntu server 14.04 LTS下搭建LAMP环境之最详细笔记之一U盘安装双系统本文原创博客地址:http://www.cnblogs.com/unofficial官网地址:www.pushself.com) 准备: 在windows系统上首先需要安装xhsell,具体下载地址可以搜一下,安

微信公众平台搭建与开发(二)开发模式的搭建和关键词回复

在第一部分介绍了编辑模式,但是编辑模式有较大局限性,下面主要开始介绍开发模式,这一部门先简单介绍下开发模式的环境搭建和关键词回复. 开发模式首先要有一个虚拟主机,本人使用的是新浪开发者平台的虚拟主机,使用云豆计算流量,若成为新浪开发者用户基本上就可以免费使用了,本人注册用户所赠送的云豆不知道能用多久.当然国内比较大还有就是百度开发者平台,注册后发现部署还没有新浪的方便,并且在BAE3.0以后好像也是要收费的.有兴趣的朋友可以研究下google的开发者平台,不知道是否要收费. 在注册新浪开发者平台

结合Django+celery二次开发定时周期任务

需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还能满足他们,优化脚本之后只要开发提供查询数据的SQL.收件人.执行时间等等参数就可以几分钟写完一个定时任务脚本 ,到后面不知道是不是吃药了一天三四个定时任务,不到半个月手里一下就20多个定时任务了,渐渐感到力不从心了,而且天天还要给他们修改定时任务的SQL.收件人.执 行时间等等,天天写定时任务脚本

Arcengine 二次开发添加右键菜单

最近在搞arcengine 二次开发,遇到了好多问题,也通过网上查资料试着慢慢解决了,把解决的步骤记录下来,有需要帮助的可以看一下,也欢迎各位来批评指正. 想给自己的map application在图层上添加右键菜单,谷歌了一下,找到了解决的方法,原文的地址edndoc.esri.com/arcobjects/9.2/NET/1ED14BF2-A0E3-4e56-A70D-B9A7F7EC7880.htm.然后我根据这个添加了自己的右键菜单,又有一些改动. 效果如图所示(有点简陋),仅仅是简单的