[REQUEST] Automatic drawing of vertical lines
-
@panga said:
... i'm manually drawing vertical lines from points of the CAD file with a known Z, and joining with the line tool the top of these vertical lines. From a later post ... if you or others sketchup users can find some similar interests in this script !
I am not a ruby scripter but I am doing some studies into the practical application of parametric variables and find your problem interesting. If you have time please tell me how you identify the points with a known Z (x,y values, or some specific intersection type, perhaps), and where does the known Z value come from(spot height label or interpolation perhaps)?
I don't have Autocad, so sorry if these questions would be answered by opening the file.
Thanks
Chris
-
Hi all,
@unknownuser said:
I am not a ruby scripter but I am doing some studies into the practical application of parametric variables and find your problem interesting. If you have time please tell me how you identify the points with a known Z (x,y values, or some specific intersection type, perhaps), and where does the known Z value come from(spot height label or interpolation perhaps)?
I'm making projects in landscape amenity, and each time I received from a geometrician an AutoCAD file that includes all the data I need : roads and buildings layouts, roads levels etc...In this file, the most important points are specified with a Z value, as text object in autocad. I'm using these values to define the height of my vertical lines, and to interpolate some others.
Try to open the autocad file with this free software : http://infograph.com/products/dwgviewer/
Note : In the file I uploaded here, the texts are converted in vectors, normally they are really text objects.@unknownuser said:
Actually I have the beginings written. I have a tool. You activate it. I can get the input point on a left button down/up. I don't know how to get values from what is entered into the VCB, so I'll have to figure that out. All in all, sounds like a fun script to try and figure out. I'll probably have questions.
Really happy if you can have fun writting this script Chris !! If you success to do it, I'll make a small tutorial of all my procedure to make my terrains. Many thanks for all your efforts.
Panga.
-
@panga said:
... each time I received from a geometrician an AutoCAD file that includes all the data I need :
Almost certainly true but not in a format that is transferable except by retyping - not good for you but interesting to me - thanks for the feedback.
Thanks and bon chance!
Chris
-
Well, my prototype is working. But I've run into issues. I can't get onLButtonDoubleClick to work when I also have an onLButtonUp method. How do I keep the on up from conflickting with my doubleclick? I should note that I have a UI.inputbox that pops up in my onLButtonUp. So as soon as the left button is released, that inputbox pops up. I think that is the conflict.
Also, I have not figured out how to remember variables inbetween tool sessions. I was thinking I should be able to start the tool, the user inputs the height. All goes well. Switch to the select or move tool. Then come back to my tool. I wanted it to remember the last input height. But I have been unsuccesful at getting that to work. I was guessing that I could try to write the value to a text file and then have my script get the value from the text file each time. Is that a reasonable solution? Or am I just doing it wrong?
@Panga Right now the script works so you input the height. The line is made so that the line is the input-height above 0. So you type 10m, the line will go to the 10m height. It doesn't go 10meters above your starting point. So if your starting point is at 5m abaove 0, and you type 10m, your line will be 5m tall. Because it will start at 5m and go to 10m for a total of 5m height. The alternative is to make it so the height entered is always the length of the line. If you start at 5m height and type 10m, your line could be 10m tall, going to an elevation of 15m. Which way is preferable to your workflow?
Allrighty, its coming along.
Chris
-
Chris, to remember user entered values across SketchUp sessions, use the Sketchup.write_defaults and read_defaults methods. Whatever you write will be written to the Windows registry or the Mac .plist file.
Pick a name (a key) wisely, like fullmer_linetool_length and store the value in a hex encoded value for best portability on both platforms. You might encounter a known bug if you don't encode a length value. (I don't remember right know if it is a dot, apost, quote or blank that causes issues on Windows.
To remember a user entered value across Tool invocations within a SketchUp session, you can just set a class variable (@@somevar) with the value you want to remember. Of course, you have to have created a class, and not just put your tool in a module...
The best design would be to do both the class variable and the xxx_defaults methods.
-
Hi Chris,
@unknownuser said:
@Panga Right now the script works so you input the height. The line is made so that the line is the input-height above 0. So you type 10m, the line will go to the 10m height. It doesn't go 10meters above your starting point. So if your starting point is at 5m abaove 0, and you type 10m, your line will be 5m tall. Because it will start at 5m and go to 10m for a total of 5m height. The alternative is to make it so the height entered is always the length of the line. If you start at 5m height and type 10m, your line could be 10m tall, going to an elevation of 15m. Which way is preferable to your workflow?
Definitly the second solution. I need to create vertical lines from a point with a specific lenght. So the height entered has to be the lenght of the line.
Thanks again.
Panga.
-
@unknownuser said:
Of course, you have to have created a class, and not just put your tool in a module...
I think a module-level variable would have sufficient scope as it would be available anywhere within the scope of the module. A module is a class, except that it can not be instantiated. So when you say you need create a class, a module will also work.
module JF # Don't initialize if it already has a value @my_var = 1 if @my_var.nil? end def JF.test_method p @my_var end p JF.test_method 1
This just shows you can't create an instance of a module even though it is a technically a class:
> Module.class Class > Class.class Class > Module.new.new Error; #<NoMethodError; (eval);33; undefined method `new' for #<Module;0x7e4f2b8>> (eval);33 > Class.new.new #<#<Class;0x7e4e430>;0x7e4e400>
-
-
@Panga, ok the script is working pretty good now. I am going to attempt to write in some code that makes it remember your last setting over SketchUp sessions. So use it, turn off sketchup and then turn it back on and it should still remember the last number you typed. That is the goal. I never did get double click to work. Oh well.
I should be done soon enough I hope,
Chris
-
ok, script released here:
http://www.sketchucation.com/forums/scf/viewtopic.php?f=180&t=16923
It does not remember your settings from one SU session to another. I kept getting a lot of errors in trying to implement read_default and write default methods. And I also couldn't figure out how to encode in hex. THat is a new world to me and I didn't find anything useful (or that I understood?) in the ruby rdocs either. I think I'm done for the night, but maybe tomorrow if I get a chance, I'll try it again. Thanks for all the help everyone! Hope its useful Panga and others,
Chris
-
@unknownuser said:
@Jim, someday I hope to understand that
+1 -
@chris fullmer said:
ok, script released here:
http://www.sketchucation.com/forums/scf/viewtopic.php?f=180&t=16923
It does not remember your settings from one SU session to another. I kept getting a lot of errors in trying to implement read_default and write default methods. And I also couldn't figure out how to encode in hex. THat is a new world to me and I didn't find anything useful (or that I understood?) in the ruby rdocs either. I think I'm done for the night, but maybe tomorrow if I get a chance, I'll try it again. Thanks for all the help everyone! Hope its useful Panga and others,
Chris
You want to convert some data to HEX values?
-
Yeah, how would I go about doing that?
Chris
-
Do you want to convert numbers to hex? Or do you want to take a string and convert each byte into a hex number?
-
I have no idea. I think the string idea (unless its harder to implement).
-
Why do you want it as hex anyway?
Hex can only be numbers, only way to convert a string is to take each characters, get the character code which is an integer, and convert that into hex values.I'm just wondering if hex numbers is what you want. If you want to store data to disk then you will want to store it as binary instead, as that's how data is stored anyway.
-
@unknownuser said:
Pick a name (a key) wisely, like fullmer_linetool_length and store the value in a hex encoded value for best portability on both platforms. You might encounter a known bug if you don't encode a length value. (I don't remember right know if it is a dot, apost, quote or blank that causes issues on Windows.
He recommended using hex so as to not store it as a normal string since there is a chance I'll encounter a bug. I suppose binary would work? Just as long as I can get away from a normal string,
Chris
-
hm... ok, you might want to probe Todd as I'm not 100% sure about this.
But converting from String to Hex-String to String, I think can be done like this:
# Pack the string to a hex string # return value is an array with one entry arrayData = "Hello World".unpack('H*')
Since
arrayData
is an array, you want to storearrayData[0]
.Then when you load the string, you have to wrap it into an array again:
# storedDataString is the string you loaded arrayData = [storedDataString] # This creates an array with the storedDataString
# Convert the Hex String back to a String; myString = arrayData.pack('H*')
Let me know if that made any sense at all.
-
Yup, that made sense (surprisingly, I'm sort of dense at times). Thanks very much Thom, I'll play with that when I get back to that part of the script. Currently trying to figure out how to average the normals of 2 planes to find a middle normal. Not having much luck so far
Chris
-
I think this will work:
vector1 = face1.normal vector2 = face2.normal vector3 = Geom;;Vector3d.linear_combination(0.5, vector1, 0.5, vector2)
Advertisement