使用Perl脚本增强Alias功能

Posted 参数化studio

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Perl脚本增强Alias功能相关的知识,希望对你有一定的参考价值。

Perl 脚本是本身是一种UNIX中的王牌工具,由于Alias本身是Linux软件的历史原因,alias默认支持Perl脚本,本文就通过一个简单的例子,给大家演示如何,利用Perl脚本快速实现点的规则阵列。

Perl脚本的特点:

  • 凝练      Perl脚本的一大优势就是使用最简单的方式解决复杂问题,更夸张的是,很多时候,很长一段代码下来,竟然没有定义一个变量你敢信!

  • “只读”      下面这段代码大家感受下,perl被戏称为read only便不言自明了。
    >

    #!/usr/bin/perl
    @lines = perldoc -u -f atan2;
    foreach (@lines){
      s/w<()[^>]+)>?|U$1/g;
      print;
    }
  • 难于学习 由于perl语言设计之初的宗旨就是,尽可能的满足程序员的需要,所有对于我们这种普通用户难免显得有点难(是我见过最bug的),但是一劳永逸,大家还是忍忍吧,谁让规则是别人定义的.

Alias中的Perl脚本:

  • 宏 Alias perl脚本可以记录我们绝大部分的操作,并以Perl脚本的显示出来.就像下面这段代码这样

    代码显示

    selectFunction( "Nothing#23" );
    clickWindowButtonXYZ( "Camera", 0, -1791.791687, -5130.841064,  1599.617615 );
    clickWindowButtonXYZ(  "Camera", 0, 78.293103, 50.000000, 0.000000  ); # from select_item
    selectFunction( "Nothing#23" );
    setIntSymbol( "Component#67", "mo_pick_lights", 0 );
    setIntSymbol( "Component#67", "mo_pick_constr_obj", 0 );
    setIntSymbol( "Component#67", "mo_pick_curves", 1 );
    setIntSymbol( "Component#67", "mo_pick_surfaces", 0 );
    setIntSymbol( "Component#67", "mo_pick_others", 0 );
    setIntSymbol( "Component#67", "mo_pick_all", 0 );
    setIntSymbol( "Component#67", "mo_pick_shells", 0 );
    setIntSymbol( "Component#67", "mo_pick_scans", 0 );
    setIntSymbol( "Component#67", "mo_pick_meshes", 0 );
    setIntSymbol( "Component#67", "mo_pick_surface_type", 2 );
    selectFunction( "Component#67" );
    initTrace( "Camera", "Component#67", 7480359,  -179.182861,  -513.081665,   159.965591 );
    appendTracePoint( 7480359,  -179.183838,  -513.082336,   159.962357 );
    endTrace(7480359);
    selectFunction( "SurfaceFillet#18" );
    clickWindowButtonXYZ( "Camera", 0, -1791.746979, -5130.839233,  1599.674377 );
    clickWindowButtonXYZ( "Camera", 0, -1791.639709, -5130.895386,  1599.610291 );
    clickWindowButtonXYZ( "Camera", 0, -1791.770477, -5130.861206,  1599.576111 );
    clickWindowButtonXYZ( "Camera", 0, -1791.620636, -5130.880127,  1599.682159 );

Perl脚本的一种操作就是直接用这个记录下的代码直接运行即可,玩过拳皇吧,连招会放吧,没错原理基本上是一样的,还有一个更洋气的名字,宏。使用场景呢,经常我们在项目后期需要做大量的倒角工作。而且有些地方不完全倒完还看不出全部的效果,如何呢,我们需要一遍又一遍的重复?NO NO NO

我们只需要将上框中的记录历史复制到下框即可,然后点击RUN-execute
大功告成,剩下的时间只需要倒一杯水,慢慢收割旁边朋友的羡慕眼神吧,嘻嘻。

  • 参数化设计 Perl脚本的实力当然不止于此,更厉害的来了,Abracadabra~~~
    下面我们要让各位看官认识一种奇怪的阵列。


如何?是不是头有点晕,熟悉Alias阵列工具的经过仔细观察,这个阵列是无法用alias直接生成的(请仔细观察!)。

这个阵列其实是一个经典数学问题,而且前人已经给出相关的方程

alpha= n*137.5

r = c*sqrt n

137.5是什么呢,可以理解为一个数学常亮吧,是这个图形能够完美紧致的前提。下图是137.3度和137.6度的结果,是不是瞬间丧失了紧致的美感。

使用Perl脚本增强Alias功能


然后就是见证奇迹的时刻了。利用学到的Perl语法,把这个公式编写进去,就得到了下面这个代码。

$height=600;
$width= 600;
$nbr_circles = 100;
$PI = 3.14159265359;

$phi = (sqrt(5)+1)/2 - 1;
# golden ratio
$golden_angle = $phi * 2 *$PI;
# golden angle

$lg_rad = $width * 0.45;
$lg_area = ($lg_rad)*($lg_rad)  * $PI;

$sm_area = $lg_area / $nbr_circles;
# Area of our little circles, if they filled the space entirely
$sm_rad = sqrt( $sm_area / $PI );
# This is related to the equation area = pi r squared

$fudge =0.5;
# Fudge factor, since our circles don't actually fill up space entirely.
$adj_sm_diameter = $sm_rad * 2 * $fudge;

$cx = $width/2;
$cy = $height/2;
$gx = 0;
$gy = 0;

for ($i = 1; $i <= $nbr_circles; $i++) {
  selectFunction( "Circle" );
  $angle = $i*$golden_angle;
  $cum_area = $i*$sm_area;
  $spiral_rad = sqrt( $cum_area /$PI );
$x =  cos($angle) * $spiral_rad;
  $y =  sin($angle) * $spiral_rad;
clickWindowButtonXYZ( "Camera", 0,  $x, $y,  0 );
print "$x - $y
";
$distance =5-sqrt(sqrt(($x-$gx)*($x-$gx) + ($y-$gy)*($y-$gy)));
selectFunction( "Scale" );
sendString( "$distance" );

}

将这个代码键入到INPUT 框中去,然后执行。然后再倒一杯水,再次收割旁人的崇拜目光。慢慢享受啪啪啪一个一个圆的生成。

经过一段时间的使用,认为Perl脚本在alias中的应用还是有很多限制,距离项目实际使用还有一段距离。但是同时Perl脚本的出现为参数化建模指出了一个新的思路,不用将所有参数化相关的问题放在GH中解决。相信经过一段时间的发展,Perl一定会进入我们的数模制作流程,进一步的提高工作效率。最后预祝大家工作顺利。


以上是关于使用Perl脚本增强Alias功能的主要内容,如果未能解决你的问题,请参考以下文章

perl脚本统计文件夹下源代码信息

如何有条件地将 C 代码片段编译到我的 Perl 模块?

《每日一题》第81题Perl脚本处理:利用perl对文本进行处理

在 Perl 脚本上使用另一个解释器运行代码

perl语言

如何在 Toad for Oracle 中使用自定义代码片段?