![]() |
【转帖】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 |
所有的时间均为北京时间。 现在的时间是 11:02 PM. |