From 5c763c8f9ebff02a723ad6b4e9cd74e29fd388de Mon Sep 17 00:00:00 2001 From: Dave Cowden <dave.cowden@gmail.com> Date: Tue, 23 Apr 2013 21:31:56 -0400 Subject: [PATCH] make pip installer --- MANIFEST | 20 +++ MANIFEST.in | 1 - README.md | 20 ++- README.txt | 71 ++++++++++ cadquery/freecad_impl/exporters.py | 7 +- doc/extending.rst | 178 ------------------------- doc/fileformat.rst | 202 ----------------------------- doc/primer.rst | 9 -- doc/primitiveref.rst | 57 -------- doc/restservice.rst | 114 ---------------- doc/roadmap.rst | 172 ------------------------ setup.py | 17 +-- tests/TestJsonMesher.py | 44 ------- tests/TestSVGexporter.py | 16 --- 14 files changed, 123 insertions(+), 805 deletions(-) create mode 100644 MANIFEST create mode 100644 README.txt delete mode 100644 doc/extending.rst delete mode 100644 doc/fileformat.rst delete mode 100644 doc/primer.rst delete mode 100644 doc/primitiveref.rst delete mode 100644 doc/restservice.rst delete mode 100644 doc/roadmap.rst delete mode 100644 tests/TestJsonMesher.py delete mode 100644 tests/TestSVGexporter.py diff --git a/MANIFEST b/MANIFEST new file mode 100644 index 0000000..05f89aa --- /dev/null +++ b/MANIFEST @@ -0,0 +1,20 @@ +README.txt +setup.cfg +setup.py +cadquery\CQ.py +cadquery\__init__.py +cadquery\cq_directive.py +cadquery\selectors.py +cadquery\workplane.py +cadquery\contrib\__init__.py +cadquery\freecad_impl\__init__.py +cadquery\freecad_impl\exporters.py +cadquery\freecad_impl\geom.py +cadquery\freecad_impl\shapes.py +cadquery\plugins\__init__.py +tests\TestCQSelectors.py +tests\TestCadObjects.py +tests\TestCadQuery.py +tests\TestExporters.py +tests\TestWorkplanes.py +tests\__init__.py diff --git a/MANIFEST.in b/MANIFEST.in index cedffaa..e69de29 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1 +0,0 @@ -recursive-exclude tests * \ No newline at end of file diff --git a/README.md b/README.md index c385622..cc89bc4 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,23 @@ CadQuery has several goals: Using CadQuery, you can write short, simple scripts that produce high quality CAD models. It is easy to make many different objects using a single script that can be customized. +Installing +============ + +1. install FreeCAD, version 0.12 or greater for your platform. http://sourceforge.net/projects/free-cad/ + +2. install:: + + pip install cadquery + +3. test your installation:: + + from cadquery import * + box = Workplane("XY").box(1,2,3) + exporters.toString(box,'STL') + +You're up and running! + Why CadQuery instead of OpenSCAD? ======================================== @@ -50,4 +67,5 @@ If you are familiar with how jQuery, you will probably recognize several jQuery * Language features that make selection and iteration incredibly easy * * Ability to use the library along side other python libraries -* Clear and complete documentation, with plenty of samples. \ No newline at end of file +* Clear and complete documentation, with plenty of samples. + diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..2e13ef5 --- /dev/null +++ b/README.txt @@ -0,0 +1,71 @@ +What is a CadQuery? +======================================== + +CadQuery is an intuitive, easy-to-use python based language for building parametric 3D CAD models. CadQuery is for 3D CAD what jQuery is for javascript. Imagine selecting Faces of a 3d object the same way you select DOM objects with JQuery! + +CadQuery has several goals: + +* Build models with scripts that are as close as possible to how you'd describe the object to a human. +* Create parametric models that can be very easily customized by end users +* Output high quality CAD formats like STEP and AMF in addition to traditional STL +* Provide a non-proprietary, plain text model format that can be edited and executed with only a web browser + +Using CadQuery, you can write short, simple scripts that produce high quality CAD models. It is easy to make many different objects using a single script that can be customized. + + +Installing +============ + +1. install FreeCAD, version 0.12 or greater for your platform. http://sourceforge.net/projects/free-cad/ + +2. install:: + + pip install cadquery + +3. test your installation:: + + from cadquery import * + box = Workplane("XY").box(1,2,3) + exporters.toString(box,'STL') + +You're up and running! + + +Why CadQuery instead of OpenSCAD? +======================================== + +CadQuery is based on OpenCasCade. CadQuery shares many features with OpenSCAD, another open source, script based, parametric model generator. + +The primary advantage of OpenSCAD is the large number of already existing model libaries that exist already. So why not simply use OpenSCAD? + +CadQuery scripts have several key advantages over OpenSCAD: + +1. **The scripts use a standard programming language**, python, and thus can benefit from the associated infrastructure. + This includes many standard libraries and IDEs + +2. **More powerful CAD kernel** OpenCascade is much more powerful than CGAL. Features supported natively + by OCC include NURBS, splines, surface sewing, STL repair, STEP import/export, and other complex operations, + in addition to the standard CSG operations supported by CGAL + +3. **Ability to import/export STEP** We think the ability to begin with a STEP model, created in a CAD package, + and then add parametric features is key. This is possible in OpenSCAD using STL, but STL is a lossy format + +4. **Less Code and easier scripting** CadQuery scripts require less code to create most objects, because it is possible to locate + features based on the position of other features, workplanes, vertices, etc. + +5. **Better Performance** CadQuery scripts can build STL, STEP, and AMF faster than OpenSCAD. + + +Where does the name CadQuery come from? +======================================== + +CadQuery is inspired by ( `jQuery <http://www.jquery.com>`_ ), a popular framework that +revolutionized web development involving javascript. + +If you are familiar with how jQuery, you will probably recognize several jQuery features that CadQuery uses: + +* A fluent api to create clean, easy to read code +* Language features that make selection and iteration incredibly easy +* +* Ability to use the library along side other python libraries +* Clear and complete documentation, with plenty of samples. \ No newline at end of file diff --git a/cadquery/freecad_impl/exporters.py b/cadquery/freecad_impl/exporters.py index 41e28b5..21768a7 100644 --- a/cadquery/freecad_impl/exporters.py +++ b/cadquery/freecad_impl/exporters.py @@ -21,7 +21,7 @@ """ import cadquery -import FreeCAD,tempfile,os +import FreeCAD,tempfile,os,StringIO from FreeCAD import Drawing try: @@ -41,6 +41,11 @@ class UNITS: IN = "in" +def toString(shape,exportType,tolerance=0.1): + s= StringIO.StringIO() + exportShape(shape,exportType,s,tolerance) + return s.getvalue() + def exportShape(shape,exportType,fileLike,tolerance=0.1): """ :param shape: the shape to export. it can be a shape object, or a cadquery object. If a cadquery diff --git a/doc/extending.rst b/doc/extending.rst deleted file mode 100644 index e126c06..0000000 --- a/doc/extending.rst +++ /dev/null @@ -1,178 +0,0 @@ -.. _extending: - -****************** -Extending CadQuery -****************** - -.. automodule:: cadfile.cadutils.cadquery - -If you find that CadQuery doesnt suit your needs, you can easily extend it. CadQuery provides several extension -methods: - - * You can load plugins others have developed. This is by far the easiest way to access other code - * you can define your own plugins. - * you can use FreeCAD script directly - -Loading external Plugins ------------------------ - -You can load a plugin using the tools.loadScript(*URL*) directive in your script. - -Using FreeCAD Script --------------------- - -The easiest way to extend CadQuery is to simply use FreeCAD script inside of your build method. Just about -any valid FreeCAD script will execute just fine. For example, this simple CadQuery script:: - - return Workplane("XY").box(1.0,2.0,3.0).val() - -is actually equivalent to:: - - return Part.makeBox(1.0,2.0,3.0) - -As long as you return a valid FreeCAD Shape, you can use any FreeCAD methods you like. You can even mix and match the -two. For example, consider this script, which creates a FreeCAD box, but then uses cadquery to select its faces:: - - box = Part.makeBox(1.0,2.0,3.0) - cq = CQ(box).faces(">Z").size() # returns 6 - - -Extending CadQuery: Plugins ----------------------------- - -Though you can get a lot done with FreeCAD, the code gets pretty nasty in a hurry. CadQuery shields you from -a lot of the complexity of the FreeCAD api. - -You can get the best of both worlds by wrapping your freecad script into a CadQuery plugin. - -A CadQuery plugin is simply a function that is attached to the CadQuery :py:meth:`CQ` or :py:meth:`Workplane` class. -When connected, your plugin can be used in the chain just like the built-in functions. - -There are a few key concepts important to understand when building a plugin - - -The Stack -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Every CadQuery object has a local stack, which contains a list of items. The items on the stack will be -one of these types: -* **A CadQuery SolidReference object**, which holds a reference to a FreeCAD solid -* **A FreeCAD object**, a Vertex, Edge, Wire, Face, Shell, Solid, or Compound - -The stack is available by using self.objects, and will always contain at least one object. - -.. note:: - - Objects and points on the stack are **always** in global coordinates. Similarly, any objects you - create must be created in terms of global coordinates as well! - - -Preserving the Chain -^^^^^^^^^^^^^^^^^^^^^^^^^ - -CadQuery's fluent api relies on the ability to chain calls together one after another. For this to work, -you must return a valid CadQuery object as a return value. If you choose not to return a CadQuery object, -then your plugin will end the chain. Sometimes this is desired for example :py:meth:`CQ.size` - -There are two ways you can safely continue the chain: - - 1. **return self** If you simply wish to modify the stack contents, you can simply return a reference to - self. This approach is destructive, because the contents of the stack are modified, but it is also the - simplest. - 2. :py:meth:`CQ.newObject` Most of the time, you will want to return a new object. Using newObject will - return a new CQ or Workplane object having the stack you specify, and will link this object to the - previous one. This preserves the original object and its stack. - - -Helper Methods -^^^^^^^^^^^^^^^^^^^^^^^^^ - -When you implement a CadQuery plugin, you are extending CadQuery's base objects. As a result, you can call any -CadQuery or Workplane methods from inside of your extension. You can also call a number of internal methods that -are designed to aid in plugin creation: - - * :py:meth:`Workplane._pointsOnStack` returns a FreeCAD Vector ( a point ) for each item on the stack. Useful if you - are writing a plugin that you'd like to operate on all values on the stack, like :py:meth:`Workplane.circle` and - most other built-ins do - - * :py:meth:`Workplane._makeWireAtPoints` will invoke a factory function you supply for all points on the stack, - and return a properly constructed cadquery object. This function takes care of registering wires for you - and everything like that - - * :py:meth:`Workplane.newObject` returns a new Workplane object with the provided stack, and with its parent set - to the current object. The preferred way to continue the chain - - * :py:meth:`Workplane.findSolid` returns the first Solid found in the chain, working from the current object upwards - in the chain. commonly used when your plugin will modify an existing solid, or needs to create objects and - then combine them onto the 'main' part that is in progress - - * :py:meth:`Workplane._addWire` must be called if you add a wire. This allows the base class to track all the wires - that are created, so that they can be managed when extrusion occurs. - - * :py:meth:`Workplane.wire` gathers up all of the edges that have been drawn ( eg, by line, vline, etc ), and - attempts to combine them into a single wire, which is returned. This should be used when your plugin creates - 2-d edges, and you know it is time to collect them into a single wire. - - * :py:meth:`Workplane.plane` provides a reference to the workplane, which allows you to convert between workplane - coordinates and global coordinates: - * :py:meth:`Plane.toWorldCoords` will convert local coordinates to global ones - * :py:meth:`Plane.toLocalCoords` will convet from global coordinates to local coordinates - -Coordinate Systems -^^^^^^^^^^^^^^^^^^^^^^ - -Keep in mind that the user may be using a work plane that has created a local coordinate system. Consequently, -the orientation of shapes that you create are often implicitly defined by the user's workplane. - -Any objects that you create must be fully defined in *global coordinates*, even though some or all of the users' -inputs may be defined in terms of local coordinates. - - -Linking in your plugin -^^^^^^^^^^^^^^^^^^^^^^^ - -Your plugin is a single method, which is attached to the main Workplane or CadQuery object. - -Your plugin method's first parameter should be 'self', which will provide a reference to base class functionality. -You can also accept other arguments. - -To install it, simply attach it to the CadQuery or Workplane object, like this:: - - def _yourFunction(self,arg1,arg): - do stuff - return whatever_you_want - - Workplane.yourPlugin = _yourFunction - -That's it! - -Plugin Example -^^^^^^^^^^^^^^^ - -This ultra simple plugin makes cubes of the specified size for each stack point. - -(The cubes are off-center because the boxes have their lower left corner at the reference points.) - -.. cq_plot:: - - def makeCubes(self,length): - #self refers to the CQ or Workplane object - - #inner method that creates a cube - def _singleCube(pnt): - #pnt is a location in local coordinates - #since we're using eachpoint with useLocalCoordinates=True - return Solid.makeBox(length,length,length,pnt) - - #use CQ utility method to iterate over the stack, call our - #method, and convert to/from local coordinates. - return self.eachpoint(_singleCube,True) - - #link the plugin into cadQuery - Workplane.makeCubes = makeCubes - - #use the plugin - result = Workplane("XY").box(6.0,8.0,0.5).faces(">Z").rect(4.0,4.0,forConstruction=True).vertices() \ - .makeCubes(1.0).combineSolids() - - diff --git a/doc/fileformat.rst b/doc/fileformat.rst deleted file mode 100644 index 13733f8..0000000 --- a/doc/fileformat.rst +++ /dev/null @@ -1,202 +0,0 @@ -.. _cadquery_reference: - -******************************** -ModelScript Format Reference -******************************** - -ParametricParts ModelScripts define a parametric 3D model that can be executed and customized by an end user. -CadQuery scripts are pure python scripts that follow a standard format. Each script contains these main components: - - :MetaData: - *(Mandatory)* Defines the attributes that describe the model, such as version and unit of measure - - :Parameters: - *(Optional)* Defines parameters and their default values, which can be - manipulated by users to customize the object. Parameters are defined by creating local variables - of a particular class type. Presets and groups organize parameters to make them easier to use - - :build script: - *(Mandatory)* Constructs the model once parameter values are collected and the model is validated. - The script must return a solid object, or a cadquery solid - -The Script Life-cycle ----------------------- - -CadQuery scripts have the following lifecycle when they are executed by a user via the web interface: - - 1. **Load Script** If it is valid, the parameters and MetaData - are loaded. A number of special objects are automatically available to your script - - 2. **Display Model to User** The parameters and default values are displayed to the user. - The model is rendered and displayed to the user using the default values - - 3. **User selects new parameter values** , either by selecting - preset combinations, or by providing values for each parameter - - 4. **Build the model** If validation is successful, the model is re-built, and the preview window is updated - - 5. **User downloads** If the user chooses to download the model as STL, STEP, or AMF, the model is re-built - again for download. - - -A Full Example Script ----------------------- - -This script demonstrates all of the model elements available. Each is briefly introduced in the sample text, -and then described in more detail after the sample:: - - """ - Comments and Copyright Statement - """ - - # - # metadata describes your model - # - UOM = "mm" - VERSION = 1.0 - - # - # parameter definitions. Valid parameter types are FloatParam,IntParam,and BooleanParam - # each paraemter can have min and max values, a description, and a set of named preset values - # - p_diam = FloatParam(min=1.0,max=500.0,presets={'default':40.0,'small':2.0,'big':200.0},group="Basics", desc="Diameter"); - - # - # build the model based on user selected parameter values. - # Must return a FreeCAD solid before exiting. - # - def build(): - return Part.makeSphere(p_diam.value); - - -Each section of the script is described in more detail below - -Metadata ----------------- - -Model metadata is provided by setting a dictionary variable called METADATA in the script. You can provide -any metadata you choose, but only these values are currently used: - -:UOM: - The unit of measure of your model. in and mm are common values, but others are allowed. - Some model formats like AMF can accept units of measure, which streamlines the printing process. **[OPTIONAL]** - -:VERSION: - The script format version. Valid versions are established by ParametricParts, currently only version 1.0 is - valid. If omitted, the latest version is assumed. **[OPTIONAL]** - - -Other metadata fields may be added in the future. - -Parameters ----------------- - -Model parameters provide the flexibility users need to customize your model. Parameters are optional, but most -users will expect at least a couple of parameters for your model to qualify as 'parametric'. - - -Parameters can be named whatever you would like. By convention, it is common to name them *p_<name>*, indicating -"parameter". - - -Each parameter has a particular type ( Float, Integer, Boolean ). Parameters also have optional attributes, which are -provided as keyword arguments: - -:desc: - A description of the parameter, displayed to the user if help is needed [Optional] - -:min: - The minimum value ( not applicable to Boolean ) [Optional] - -:max: - The maximum value ( not applicable to Boolean ) [Optional] - -:presets: - A dictionary containing key-value pairs. Each key is the name of a preset, and the value is the value the - parameter will take when the preset is selected by the user. - - - When a model defines presets, the user is presented with a choice of available presets in a drop-down-list. - Selecting a preset changes the values of all parameters to their associated values. - - If it exists, the special preset named 'default' will be used to populate the default values when the user - is initially presented with the model. - - When the model is built, the parameters are checked to ensure they meet the constraints. If they do not, - an error occurs. - -:group: - If provided, parameters will be grouped together when displayed to the user. Any ungrouped parameters - will display in a special group named `default`. Groups help divide a long list of parameters to make - them easier to understand. Examples might include 'basics' and 'advanced' - - -Build Method ------------------------ - -The heart of your model is the build method. Your build method must be called 'build':: - - def build(): - return Workplane("XY").box(1,1,1) - -Your build method use any combination of FreeCAD, python, and CadQuery to construct objects. -You must return one of two things: - - 1. A CadQuery object, or - 2. A FreeCAD object - -In your build script,you retrieve the values of the parameters by using ``<parameter_name>.value``. - -The following modules are available when your script runs: - -Scripts Using CadQuery Syntax -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - :python syntax: - Python loops, dictionaries, lists, and other standard language structures are available. - - :math: - Python's math package is imported for you to use - - :FloatParam,IntegerParam,BooleanParam: - Parameter types used to declare parameters - - :Workplane: - The CadQuery workplane object, which is the typical starting point for most scripts - - :CQ: - The CadQuery object, in case you need to decorate a normal FreeCAD object - - :Plane: - The CadQuery Plane object, in case you need to create non-standard planes - - -.. warning:: - - Though your script is a standard python script, it does **not** run in a standard python environment. - - For security reasons, most python packages, like sys, os, import, and urllib are restricted. - - -FreeCAD Build Scripts -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -It is recommended that you use CadQuery for your model scripts-- the syntax is much shorter and more convienient. - -But if you are willing to write more code, you can get access to all of the features that the FreeCAD library provides. - -When your script executes, these FreeCAD objects are in scope as well: - - :Part: - FreeCAD.Part - :Vector: - FreeCAD.Base.Vector - :Base: - FreeCAD.Base - -**If you use a FreeCAD build script, your build method must return a FreeCAD shape object.** - -Should you choose to write your model with the lower-level FreeCAD scripts, you may find this documentation useful: - -http://sourceforge.net/apps/mediawiki/free-cad/index.php?title=FreeCAD_API - diff --git a/doc/primer.rst b/doc/primer.rst deleted file mode 100644 index c10e52e..0000000 --- a/doc/primer.rst +++ /dev/null @@ -1,9 +0,0 @@ -.. _3d_cad_primer: - -*********************** -3D CAD Primer -*********************** - -This section provides a basic introduction to 3D modeling. It will get you started with the basics. After that, -you may want to do some heavier reading on the subject (PUT LINKS HERE ) - diff --git a/doc/primitiveref.rst b/doc/primitiveref.rst deleted file mode 100644 index 480752c..0000000 --- a/doc/primitiveref.rst +++ /dev/null @@ -1,57 +0,0 @@ -.. _primreference: - -*********************** -Primitive Class Reference -*********************** - -.. automodule:: cadfile.cadutils.cad - - -.. autosummary:: - - Plane - Vector - Solid - Shell - Wire - Edge - Vertex - -Geometry Classes ------------------- - -.. autoclass:: Vector - :members: - -.. autoclass:: Plane - :members: - -Shape Base Class -------------------- - -All objects inherit from Shape, which as basic manipulation methods: - -.. autoclass:: Shape - :members: - -Primitive Classes --------------------- - -.. autoclass:: Solid - :members: - - -.. autoclass:: Shell - :members: - - -.. autoclass:: Wire - :members: - - -.. autoclass:: Edge - :members: - - -.. autoclass:: Vertex - :members: diff --git a/doc/restservice.rst b/doc/restservice.rst deleted file mode 100644 index 6a9139b..0000000 --- a/doc/restservice.rst +++ /dev/null @@ -1,114 +0,0 @@ -.. _buildservice: - -****************************************** -The Parametric Parts Build Service -****************************************** - - -If you have registered for an account, you can use the REST api to build models from your website or platform. -Each request to the service will construct a model in the format you choose. - - -Using the Build Service -------------------------- - -The Build Service endpoint is `<https://parametricparts.com/parts/build>`_ - -In each request, you provide four main things via either a GET or a POST : - - 1. **An API Key**, to identify yourself. - 2. **A ModelScript to build**, either by providing the entire script, or the id of a model stored on - parametricparts.com, - 3. **The type of output** you want, - 4. **The Model parameters** that should be supplied to the model. - -.. note:: - - GET or POSTs are allowed, but be aware that URLs for GET requests are limited to 4K, - so POSTs are advised if you are sending your modelScript via the URL - -The output streamed in the format you have requested. - -Errors are provided using standard HTTP error codes: - - :200: if the build is a success - :403: if the APIKey is invalid, or if your account cannot execute any more downloads - :404: if the requested model cannot be found - :50X: if there is a problem generating the model - -Build Service Parameters --------------------------- - -All parameters must be URL encoded: - - :key: - (Required) Your API Key. See :ref:`gettingakey` If you do not have one. - - :id: - (Either id or s is Required) The id of the ParametricParts.com ModelScript to build. The id is the last part of the url - when viewing the model: http://parametricparts.com/parts/<modelId>. Model ids are between 7 and 9 - characters, for example '4hskpb69'. - - :s: - (Either id or s is Required) The ModelScript to build. This should be a valid parametricparts.com ModelScript. - If both id and s are provided, s takes precedence. - - :type: - (Required) ("STL" | "STEP" | "AMF" | "TJS" ). The type of output you want to receive. STL, STEP, - and AMF return the corresponding industry standard format. - TJS will return JSON content suitable for display in a Three.js scene. - - :preset: - (Optional) The name of a preset defined in the ModelScript. If omitted, other parameters are used. - If a preset is provided in addition to parameters, then the preset is applied first, and then - parameters are set afterwards. - - :<params>: - (Optional) Remaining URL parameters are mapped onto ModelScript parameters of the same name. Each - parameter value must have the datatype corresponding to the parameter in the ModelScript. To supply multiple - parameters, send an HTTP parameter for each desired value, having name matching the name of the ModelScript - parameter, and value having the value for that parameter. If no - parameters are provided, output is generated using ModelScript defaults. - -Example --------------------------- - -This example builds STEP for a trivial model, without supplying any model parameters or presets:: - - POST https://parametricparts.com/parts/build HTTP/1.1 - key:259cd575c9a2998420ac65f21b2d6b2a - s:def+build%28%29%3A%0D%0A++++return+Part.makeBox%281%2C2%2C3%29%0D%0A++++++++ - type:AMF - - -This example selects an existing model (2qus7a32 ) on the server, and requests -preset 'short', as well as adjusting parameter 'p_length' to value 120:: - - POST https://parametricparts.com/parts/build HTTP/1.1 - key:259cd575c9a2998420ac65f21b2d6b2a - id:2qus7a32 - type:STL - preset:short - p_length:120 - - -.. _gettingakey: - -Signing Up ------------------------ - -In order to use the API, you first need to have an API key. To get one: - - 1. `Sign Up <https://parametricparts.com/account/signup>`_ for a ParametricParts account - 2. `Contact ParametricParts Support <http://support.parametricparts.com/customer/portal/emails/new>`_ to request API key access. - API keys usually require an enterprise license, but are available for free evaluation if you request access - 3. Log onto your ParametricParts account, and generate an API Key using the `API Keys <https://localhost:8080/key/keys>`_ link. - 4. Test your api key using the api key tester `Here <https://parametricparts.com/apitester>`_ - If the test goes well, you'll see STL output from the sample script. - -Now you are ready to make REST requests to build models. - -.. warning:: - - Make sure to keep your API Key secret, as any requests that use your key will be charged to your account. - You can disable or generate a new API Key from your account page. \ No newline at end of file diff --git a/doc/roadmap.rst b/doc/roadmap.rst deleted file mode 100644 index 12865d1..0000000 --- a/doc/roadmap.rst +++ /dev/null @@ -1,172 +0,0 @@ -.. _roadmap: - -************************** -RoadMap: Planned Features -************************** - -**CadQuery is not even close to finished!!!** - -Many features are planned for later versions. This page tracks them. If you find that you need features -not listed here, let us know! - -Core --------------------- - -end(n) - allows moving backwards a fixed number of parents in the chain, eg end(3) is same as end().end().end() - -FreeCAD object wrappers - return CQ wrappers for FreeCAD shapes instead of the native FreeCAD objects. - -Improved iteration tools for plugin developers - make it easier to iterate over points and wires for plugins - -More parameter types (String? ) - -face.outerWire - allow selecting the outerWire of a face, so that it can be used for reference geometry or offsets - -Selectors --------------------- - -Chained Selectors - Space delimited selectors should be unioned to allow multiple selections. For example ">Z >X" - -Ad-hoc axes - for example, >(1,2,1) would select a face with normal in the 1,2,1 direction - -logic inversion - ! or not to invert logic, such as "!(>Z)" to select faces _other_ than the most z facing - -closest to point - support faces, points, or edges closest to a provided point - -tagged entities - support tagging entities when they are created, so they can be selected later on using that tag. - ideally, tags are propagated to features that are created from these features ( ie, an edge tagged with 'foo' - that is later extruded into a face means that face would be tagged with 'foo' as well ) - - -Workplanes --------------------- - -rotated workplanes - support creation of workplanes at an angle to another plane or face - -workplane local rotations - rotate the coordinate system of a workplane by an angle. - -make a workplane from a wire - useful to select outer wire and then operate from there, to allow offsets - -2-d operations -------------------- - -offsets - offset profiles, including circles, rects, and other profiles. - -ellipses - create elipses and portions of elipses - -regular polygons - several construction methods: - * number of sides and side length - * number of sides inscribed in circle - * number of sides circumscribed by circle - -arc construction using relative measures - instead of forcing use of absolute workplane coordinates - -tangent arcs - after a line - -centerpoint arcs - including portions of arcs as well as with end points specified - -trimming - ability to use construction geometry to trim other entities - -construction lines - especially centerlines - -2-d fillets - for a rectangle, or for consecutive selected lines - -2-d chamfers - based on rectangles, polygons, polylines, or adjacent selected lines - -mirror around centerline - using centerline construction geometry - -rectangular array - automate creation of equally spread points - -polar array - create equally spaced copies of a feature around a circle - perhaps based on a construction circle? - -midpoint selection - select midpoints of lines, arcs - -face center - explicit selection of face center - -manipulate spline control points - so that the shape of a spline can be more accurately controlled - -feature snap - project geometry in the rest of the part into the work plane, so that - they can be selected and used as references for other features. - -polyline edges - allow polyline to be combined with other edges/curves - -create text - ideally, in various fonts. - -3-d operations ---------------------- - -rotation/transform that return a copy - The current rotateAboutCenter and translate method modify the object, rather than returning a copy - -primitive creation - Need primitive creation for: - * cone - * sphere - * cylinder - * torus - * wedge - -extrude/cut up to surface - allow a cut or extrude to terminate at another surface ,rather than either through all or a fixed distance - -extrude along a path - rather than just normal to the plane. This would include - -loft - create a feature between two or more wire sections - -revolve - revolve a wire around an axis to create a solid - -STEP import - allow embedding and importing step solids created in other tools, which - can then be further manipulated parametrically - -Dome - very difficult to do otherwise - -primitive boolean operations - * intersect - * union - * subtract - - -Algorithms ---------------------- - -Wire Discretization - Sample wires at point interval to improve closet wire computations - - diff --git a/setup.py b/setup.py index 873d085..aebd6bf 100644 --- a/setup.py +++ b/setup.py @@ -1,22 +1,19 @@ +from distutils.core import setup + setup( name='cadquery', - version=get_version(), + version='0.1.2', url='https://github.com/dcowden/cadquery', license='LGPL', author='David Cowden', author_email='dave.cowden@gmail.com', description='CadQuery is a parametric scripting language for creating and traversing CAD models', - long_description=__doc__, - packages=find_packages(), + long_description=open('README.txt').read(), + packages=['cadquery','cadquery.contrib','cadquery.freecad_impl','cadquery.plugins','tests'], include_package_data=True, zip_safe=False, platforms='any', - install_requires=['FreeCAD'], #how to list FreeCAD here? - #entry_points='''\ - #[console_scripts] - ##rqworker = rq.scripts.rqworker:main - #rqinfo = rq.scripts.rqinfo:main - #''', + classifiers=[ # As from http://pypi.python.org/pypi?%3Aaction=list_classifiers #'Development Status :: 1 - Planning', @@ -31,7 +28,7 @@ setup( 'Intended Audience :: Information Technology', 'Intended Audience :: Science/Research', 'Intended Audience :: System Administrators', - 'License :: OSI Approved :: LGPL License', + 'License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)', 'Operating System :: POSIX', 'Operating System :: MacOS', 'Operating System :: Unix', diff --git a/tests/TestJsonMesher.py b/tests/TestJsonMesher.py deleted file mode 100644 index 00c7383..0000000 --- a/tests/TestJsonMesher.py +++ /dev/null @@ -1,44 +0,0 @@ -import unittest -from JsonUtils import JsonMesh -import FreeCAD -from FreeCAD import Part -from FreeCAD import Vector - -""" - WARNING: set FREECAD_HOME for these tests to work! -""" -class TestJSonModel(unittest.TestCase): - - def setUp(self): - self.mesh = JsonMesh(); - - def testOneFace(self): - mesh = self.mesh; - mesh.addVertex(0.0,0.0,0.0); - mesh.addVertex(1.0,1.0,0.0); - mesh.addVertex(-1.0,1.0,0); - mesh.addTriangleFace(0, 1, 2); - self.assertEqual(3*3,len(mesh.vertices)); - self.assertEqual(1+3,len(mesh.faces)); - - def testSphere(self): - - #make a sphere - p = Part.makeSphere(2.0); - t = p.tessellate(0.01); #a pretty fine mesh - - #add vertices - for vec in t[0]: - self.mesh.addVertex(vec.x, vec.y, vec.z); - - #add faces - for f in t[1]: - self.mesh.addTriangleFace(f[0],f[1], f[2]); - - #make resulting json - self.mesh.buildTime = 0.1; - js = self.mesh.toJson(); - - #make sure the mesh has like >1000 vertices - self.assertTrue(self.mesh.nVertices > 1000); - self.assertTrue(self.mesh.nFaces > 1000); diff --git a/tests/TestSVGexporter.py b/tests/TestSVGexporter.py deleted file mode 100644 index 4c32874..0000000 --- a/tests/TestSVGexporter.py +++ /dev/null @@ -1,16 +0,0 @@ -__author__ = 'dcowden' - -from cadquery import * - -import unittest,sys -from tests import MakeTestObjects -import SVGexporter - -class TestCadQuery(unittest.TestCase): - def setUp(self): - pass - - def testExport(self): - t = MakeTestObjects.makeCube(20) - - SVGexporter.exportSVG(t,'c:/temp/test.svg') \ No newline at end of file