高级会员
注册日期: 06-11
帖子: 14579
精华: 1
现金: 224494 标准币
资产: 234494 标准币
|
【转帖】macro help, finding and reporting distance in a msgbo
macro help, finding and reporting distance in a msgbox
i'm trying (very unsuccessfully) to write a macro to report the minimum distance between two objects in an assembly. one is a part, the other a face. i found the modeldoc2.closestdistance, but can't seem to get the objects to work. how does closestdistance work? what about measuredistance? i know some vb, but am apparently lacking. i don't need it to be real accurate, if it's over 1" i report one msgbox, under another (already figured out if-then-else statements). the other challenge is that this assembly will be driven via driveworks express, so the file names will change, but i think i have a method figured out to read that in.
ben,
did you study/try the examples for modeldoc2.closestdistance? they work fine. if you post your code here it is much easier to help you.
jørn
jorn bjarning
cswp
cad & plm consultant
sw2008 sp5 / sw2009 sp2
1. as jorn suggested, posting your code here may help.
2. what sort of objects are you trying to pass into the function? sounds like you need a face2 object and a component2 object.
3. if you are looking for a perpendicular distance from a planar face to your component you will likely have to mess around with transforms. closestdistance will give you the closest absolute distance. if your component is 1" away perpendicular to the plane of the face and 1" outside the boundary of the face then closestdistance will report 1.4142.... (square root of 2) as the closest distance. of course, if your part is cylindrical and its axis is parallel to the planar face but it lies outside the face boundary then closestdistance will measure to some point somewhere on the cylinder and you really won't be able to calculate the normal distance very well at all.
if you are using sw 2008 then the measure object/tool may work better for you than closestdistance.
i'll get you eh steve, if it's the last thing i dooooo!
i didn't know there were examples, where can i see these examples?
ben,
look up modeldoc2.closestdistance in the api help. on top of the page you will see links called 'see also', 'example' and 'availability'
jorn bjarning
cswp
cad & plm consultant
sw2008 sp5 / sw2009 sp2
thank you very much, will study examples and sample the code i need.
okay, so i'm dumber then i thought... what i need to do is measure the distance between two objects in an assembly generated by driveworks express. the basic principle is that if the distance is less than 1 inch (to account for sag across a 40+ foot span), then the model will collide. the surfaces or components need to be pre-selected not by the operator, but by the macro (my boss wants this nearly idiot proof, 1 button, no possibility for error). then it spits up a msgbox with either a warning, or a clearance. my code is below, basically ripped off the whole code from the examples. it works, except for the fact that the distance reported is always wrong. optimally i'd pass 2 components into the code so that it doesn't matter what surface is closest. i realize that any half intelligent trained monkey can use the "measure" tool, but my boss doesn't see it that way. thank you for your time.
edit : removed enum
sub main()
dim swapp as sldworks.sldworks
dim swmodel as sldworks.modeldoc2
dim swselmgr as sldworks.selectionmgr
dim swselobj1 as object
dim swselobj2 as object
dim vpt1 as variant
dim vpt2 as variant
dim ndist as double
dim swskpoint1 as sldworks.sketchpoint
dim swskpoint2 as sldworks.sketchpoint
dim swskline as sldworks.sketchline
dim bret as boolean
set swapp = application.sldworks
set swmodel = swapp.activedoc
set swselmgr = swmodel.selectionmanager
set swselobj1 = swselmgr.getselectedobject5(1)
set swselobj2 = swselmgr.getselectedobject5(2)
ndist = swmodel.closestdistance(swselobj1, swselobj2, vpt1, vpt2)
debug.assert ndist > 0#
debug.assert not isempty(vpt1)
debug.assert not isempty(vpt2)
debug.print "file = " & swmodel.getpathname
debug.print " seltype1 = " & swselmgr.getselectedobjecttype2(1)
debug.print " seltype2 = " & swselmgr.getselectedobjecttype2(2)
debug.print " pt1 = (" & vpt1(0) * 1000# & ", " & vpt1(1) * 1000# & ", " & vpt1(2) * 1000# & ") in"
debug.print " pt2 = (" & vpt2(0) * 1000# & ", " & vpt2(1) * 1000# & ", " & vpt2(2) * 1000# & ") in"
debug.print " dist = " & ndist * 1000# & " in"
swmodel.setaddtodb true
swmodel.insert3dsketch2 false
dim msg, style, title, help, ctxt, response, mystring
if ndist < 1 then
msg = "warning bottom truss will hit, clearance is "
style = vbokonly + vbcritical + vbdefaultbutton2 ' define buttons.
title = "insufficient clearance" ' define title.
help = "demo.hlp" ' define help file.
ctxt = 1000 ' define topic
' context.
' display message.
else
msg = "bottom truss clears by "
style = vbokonly + vbcritical + vbdefaultbutton2 ' define buttons.
title = "insufficient clearance" ' define title.
help = "demo.hlp" ' define help file.
ctxt = 1000 ' define topic
end if
response = msgbox(msg & ndist, style, title, help, ctxt)
set swskpoint1 = swmodel.createpoint2(vpt1(0), vpt1(1), vpt1(2))
set swskpoint2 = swmodel.createpoint2(vpt2(0), vpt2(1), vpt2(2))
set swskline = swmodel.createline2(vpt1(0), vpt1(1), vpt1(2), vpt2(0), vpt2(1), vpt2(2))
swmodel.setaddtodb false
swmodel.insert3dsketch2 true
end sub
'-----------------
edited: 03/17/2009 at 02:01 pm by ben reilly
how far off is your distance? is it off by something like a factor of 25.4 maybe?
i'll get you eh steve, if it's the last thing i dooooo!
okay, so the last two i ran was off by a factor of 1/25.4 * 1000, so somehow a conversion went horribly wrong. i just stuck a conversion factor into the code at ndist = swmodel.closestdistance(swselobj1, swselobj2, vpt1, vpt2) * 1/25.4*1000. it's a bandaid, but it fixes it.
somewhere there must be a metric conversion... i see a conversion from meter to mm, so i'm guessing that closestdistance automatically calls in a meter distance, hence the conversion problem.
now, anybody know how to stuff objects (solid bodies) into closestdistance instead of surfaces?
i really appreciate the help you guys have been giving such a noob... or should that be boob?
edited: 03/15/2009 at 02:40 pm by ben reilly
i think i figured it out, it takes components the way the code is
one more problem, i can get it to take components and i can get it to take surfaces, but closest.distance doesn't seem to like bodyfeatures? my problem code is below, i'll include the entire macro so you can see the whole thing, but the problem is when i try to measure the distance between body features. (look for 'set ut dist, ttdist, or btdist, all of these do not calculate, but do not throw an error.)
edit: removed enum
sub main()
dim swapp as sldworks.sldworks
dim swmodel as sldworks.modeldoc2
dim swselmgr as sldworks.selectionmgr
dim swselobj1 as object
dim swselobj2 as object
dim vpt1 as variant
dim vpt2 as variant
dim ndist as double
dim swskpoint1 as sldworks.sketchpoint
dim swskpoint2 as sldworks.sketchpoint
dim swskline as sldworks.sketchline
dim bret as boolean
dim bdoorframejmem as string
dim bdoorframeimem as string
dim udoorframeimem as string
dim bdoorframedmem as string
dim udoorframedmem as string
dim utdist as double 'upper frame to truss distance
dim btdist as double 'bottom frame to truss distance
dim ttdist as double 'truss to truss distance
set swapp = application.sldworks
set swmodel = swapp.activedoc
set swselmgr = swmodel.selectionmanager
dim vresarray as variant
dim arraybound as integer
dim titlestr as string, ordernumber as string
titlestr = swmodel.gettitle() 'get title
' msgbox titlestr 'for debugging
vresarray = split(titlestr, "-") 'separate at dash
arraybound = ubound(vresarray)
titlestr = vresarray(arraybound) 'set title to second part
vresarray = split(titlestr, ".") 'separate extension from title
ordernumber = vresarray(0) 'set ordernumber as number
dim bdoorframe as string, bcord as string, udoorframe as string
bdoorframe = "bottom door frame -" + ordernumber + "-1@driveworks bifold master -" + ordernumber
bcord = "bottom cord -" + ordernumber + "-1@driveworks bifold master -" + ordernumber
|