# # Copyright 2004 (c) Pointwise, Inc. # All rights reserved. # # This sample Gridgen script is not supported by Pointwise, Inc. # It is provided freely for demonstration purposes only. # SEE THE WARRANTY DISCLAIMER AT THE BOTTOM OF THIS FILE. # # The domain OnDbEnts create command creates connectors # on each curve of the underlying trimmed surface boundary. # Normally, this is the desired result, however, some trimmed # surface boundaries are defined by multiple curves with lengths # considerably smaller than the desired grid spacing. In this # case, the grid is artificially clustered on the short boundary # curves. # # This script attempts to correct this condition by joining # the connectors of selected domains into larger, more meaningful, # connectors. # # Selected unstructured domains' connectors will be joined subject # to a maximum turning angle and redimensioned subject to the # current default connector spacing (if defined). # package require PWI_Glyph 1.5.1 gg::updatePolicy DELAYED #-- maximum allowed turning angle between cons to be joined set turningAngle 50.0 #-- get con point spacing from current default value set defdim [gg::defConDim] set mode [lindex $defdim 0] set val [lindex $defdim 1] if { $mode == "spacing" } { set spacing $val } else { #-- default con spacing not set - do not redimension cons set spacing 0.0 } ############################################################# # JoinDomCons - Join a domain's connectors based # on a turning angle. # proc JoinDomCons {domId angle spacing} { #-loop over dom edges joining cons were possible gg::domReport $domId domInfo STRUCTURE if {$domInfo(type) == "UNSTRUCTURED"} { set unsDom 1 } else { set unsDom 0 } set edges [gg::domGetEdge $domId] foreach edge $edges { set nbreaks 0 set ncons [llength $edge] set conL [lindex $edge 0] if { $unsDom && $ncons <= 3 } { #-- skip this loop - not enough cons to join continue } for {set icon 1} {$icon < $ncons} {incr icon} { set conR [lindex $edge $icon] if {[CheckConTurnAngle $conL $conR $angle] == 0 } { #-- con turning angle is greater than input - don't join set conL $conR incr nbreaks continue } if {$unsDom && $nbreaks == 0 && [expr 1.0*$icon/$ncons] > 0.5 } { #-- More than half of cons already joined without a break. #-- Don't join the current con so the edge will be #-- defined by a minimum of 2 equal sized cons. set conL $conR incr nbreaks continue } if [catch {gg::conJoin $conL $conR} conL] { #-- Couldn't join cons set conL $conR incr nbreaks } } } if {!$unsDom || $spacing <= 0.0} { return } #-- reset con dimension and distribution set edges [gg::domGetEdge $domId] foreach edge $edges { foreach con $edge { set subdims [gg::conSubConDim $con] set nsubs [llength [lindex $subdims 0]] for {set sub 1} {$sub < $nsubs} {incr sub} { gg::conDeleteBreakPt $con 1 } gg::conDistFunc $con -function TANH gg::conBeginSpacing $con 0.0 gg::conEndSpacing $con 0.0 gg::conDim $con -spacing $spacing } } } ############################################################# # CheckConTurnAngle - Determine if two connectors join # with a turning angle less than the input value # and return 1 if they do, otherwise return 0. # proc CheckConTurnAngle {conId1 conId2 turnAng} { #-- delta arclength for determining con direction at endpoint set ds 0.05 set c1_p1 [gg::conGetPt $conId1 -arc 0.0] set c1_p2 [gg::conGetPt $conId1 -arc 1.0] set c2_p1 [gg::conGetPt $conId2 -arc 0.0] set c2_p2 [gg::conGetPt $conId2 -arc 1.0] set pi 3.141592654 set tol [gg::tolNode] if {$tol > [ggu::vec3Length [ggu::vec3Sub $c1_p2 $c2_p1]]} { #-- cons join at c1_p2 and c2_p1 set p [gg::conGetPt $conId1 -arc [expr 1.0-$ds]] set vec1 [ggu::vec3Sub $c1_p2 $p] set p [gg::conGetPt $conId2 -arc $ds] set vec2 [ggu::vec3Sub $p $c2_p1] } elseif {$tol > [ggu::vec3Length [ggu::vec3Sub $c2_p2 $c1_p1]]} { #-- cons join at c1_p1 and c2_p2 set p [gg::conGetPt $conId1 -arc $ds] set vec1 [ggu::vec3Sub $c1_p1 $p] set p [gg::conGetPt $conId2 -arc [expr 1.0-$ds]] set vec2 [ggu::vec3Sub $p $c2_p2] } elseif {$tol > [ggu::vec3Length [ggu::vec3Sub $c1_p1 $c2_p1]]} { #-- cons join at c1_p1 and c2_p1 set p [gg::conGetPt $conId1 -arc $ds] set vec1 [ggu::vec3Sub $c1_p1 $p] set p [gg::conGetPt $conId2 -arc $ds] set vec2 [ggu::vec3Sub $p $c2_p1] } elseif {$tol > [ggu::vec3Length [ggu::vec3Sub $c2_p2 $c1_p2]]} { #-- cons join at c2_p2 and c1_p2 set p [gg::conGetPt $conId1 -arc [expr 1.0-$ds]] set vec1 [ggu::vec3Sub $c1_p2 $p] set p [gg::conGetPt $conId2 -arc [expr 1.0-$ds]] set vec2 [ggu::vec3Sub $p $c2_p2] } else { #puts "Cons $conId1 and $conId2 don't join" return 0 } set dot [ggu::vec3Dot $vec1 $vec2] set val [expr 1.0*$dot / [ggu::vec3Length $vec1] / [ggu::vec3Length $vec2]] set ang [expr acos($val)*180.0/$pi] #puts "Cons join with a $ang degree angle" if { $ang < $turnAng } { return 1 } return 0 } set title "UnsDomOnDbEnts Cleanup" set msg "Selected unstructured domains' cons will be joined with max turning angle of $turningAngle and redim'd with spacing of $spacing." if { $spacing <= 0.0 } { set msg "Selected unstructured domains' cons will be joined with max turning angle of $turningAngle, but NOT redim'd. Set the default con spacing first to force redim." } set doms [gg::dispPick DOMAIN -type UNSTRUCTURED -title $title -message $msg ] if {[llength $doms] > 0 } { foreach dom $doms { JoinDomCons $dom $turningAngle $spacing } } # # DISCLAIMER: # TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, POINTWISE DISCLAIMS # ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED # TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE, WITH REGARD TO THIS SCRIPT. TO THE MAXIMUM EXTENT PERMITTED # BY APPLICABLE LAW, IN NO EVENT SHALL POINTWISE BE LIABLE TO ANY PARTY # FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES # WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF # BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE # USE OF OR INABILITY TO USE THIS SCRIPT EVEN IF POINTWISE HAS BEEN # ADVISED OF THE POSSIBILITY OF SUCH DAMAGES AND REGARDLESS OF THE # FAULT OR NEGLIGENCE OF POINTWISE. #