Giter VIP home page Giter VIP logo

admesh's Introduction

About this release and repository:

ADMesh was released as an application in 1995/96. Not much happened since then. As the code of this project might bring use for others, this "fork" was created to provide a shared library. Once done that, I've collected lots of bugfixes from the world around us.

No further development will be done, but bugs will be resolved, if possible.

Don't patch this project downstream but use this code, so all can benefit from the changes. Pull requests are welcome, but be sure to generate no warnings.

Grab the 0.98.5 tarball: https://github.com/admesh/admesh/releases/download/v0.98.5/admesh-0.98.5.tar.gz

About ADMesh:

ADMesh is a program for processing triangulated solid meshes. Currently, ADMesh only reads the STL file format that is used for rapid prototyping applications, although it can write STL, VRML, OFF, and DXF files.

Additional information regarding the underlying algorithms of ADMesh can be found in Anthony Martin's Masters Thesis available from here:

http://www.varlog.com/admesh-htm/ADMeshThesis.zip

Features:

  • Read and write binary and ASCII STL files
  • Check STL files for flaws (i.e. unconnected facets, bad normals)
  • Repair facets by connecting nearby facets that are within a given tolerance
  • Fill holes in the mesh by adding facets.
  • Repair normal directions (i.e. facets should be CCW)
  • Repair normal values (i.e. should be perpendicular to facet with length=1)
  • Remove degenerate facets (i.e. facets with 2 or more vertices equal)
  • Translate in x, y, and z directions
  • Rotate about the x, y, and z axes
  • Mirror about the xy, yz, and xz planes
  • Scale the part by a factor
  • Merge 2 STL files into one
  • Write an OFF file
  • Write a VRML file
  • Write a DXF file
  • Calculate the volume of a part

ADMesh outputs the following statistics after processing:

================= Results produced by ADMesh version 0.98.5 =================
Input file         : sphere.stl
File type          : Binary STL file
Header             : Processed by ADMesh version 0.98.5
============== Size ==============
Min X = -1.334557, Max X = 1.370952
Min Y = -1.377953, Max Y = 1.377230
Min Z = -1.373225, Max Z = 1.242838
========= Facet Status ========== Original ============ Final ====
Number of facets                 :  3656                3656
Facets with 1 disconnected edge  :    18                   0
Facets with 2 disconnected edges :     3                   0
Facets with 3 disconnected edges :     0                   0
Total disconnected facets        :    21                   0
=== Processing Statistics ===     ===== Other Statistics =====
Number of parts       :     1        Volume   :  10.889216
Degenerate facets     :     0
Edges fixed           :    24
Facets removed        :     0
Facets added          :     0
Facets reversed       :     0
Backwards edges       :     0
Normals fixed         :     0

There are two different algorithms used for fixing unconnected facets. The first algorithm finds an unconnected edge, and then checks nearby within a given tolerance for another unconnected edge. It then fixes edges within tolerance. Some meshes can be completely fixed just using this method. If there are still unconnected facets after this "nearby check" has been done, then a second algorithm is used. This algorithm just fills any holes in the mesh by adding facets until all of the holes are filled. Using these two algorithms, almost any imperfect STL file can be "fixed" 100% so that there are 0 unconnected facets. Whether the resulting mesh is what you really want is another question since there is no way for ADMesh to add information that isn't there.

At this point ADMesh is only command-line driven and has no windowing capabilities. This should make it extremely easy to port to any UNIX-like system, and it shouldn't have any problems compiling on Windows NT, and some people have had success compiling it under DOS or Windows using DJGPP.

ADMesh was developed on a 486/66 with 16Mb running the Linux operating system. It has also been compiled and run on the following systems: SunOS 4.1.3 IRIX 5.2 Please let me know about successes or failures with other systems.

On my Linux system with 16Mb of memory, I can easily process files that have up to about 200,000 facets. Files larger than this can be processed, but the system begins to slow down significantly due to swapping. A system with more memory will be able to process greater numbers of facets more easily. Following are some indications of process times:

  • 40,000 facets: 10 seconds
  • 80,000 facets: 20 seconds
  • 160,000 facets: 50 seconds
  • 320,000 facets: 13 minutes (heavy swapping occurred)

Note that those times were calculated around 1996.

ADMesh is free but copyrighted software. It is distributed under the terms of the GNU General Public License (GPL). Details of the GPL are in the file COPYING that comes with the ADMesh software package.

admesh's People

Contributors

2bright avatar alranel avatar andreondra avatar cejkato2 avatar daef avatar dronecfd avatar dthadi3 avatar fernape avatar gladk avatar hroncok avatar hyperair avatar ixce avatar jonatan1024 avatar marekzehra avatar mattwlowe avatar mcorbe avatar obriencj avatar printathing avatar scarabeusiv avatar udif avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

admesh's Issues

Errors during the build process (ChangeLog, AUTHORS)

I'm guessing the files AUTHORS and ChangeLog need to generated and included in your releases. When building I get the following:

git log --format='%aN <%aE>' | sort -u > AUTHORS
fatal: Not a git repository (or any parent up to mount point /)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).

If I do a touch to create the files before I run make, then the build completes without error.

BTW, in case anyone is looking for instructions, the configure script is created by running the autogen.sh script. Then you can just follow the standard procedure outlined in the INSTALL documentation (which needs to be updated to include these steps, or the configure script needs to be included in the releases).

[feature-request] Separate disconnected parts.

Hi,
I was looking for a way to split pretty large stl into separated components. Sadly meshlab gave up around 700 on my machine {ram:16Gb}. I was looking for a cli util and stumble upon admesh. Noticed there is a tool to calculate discontinued parts for the stl file. Would there be a much hassle to add options to iteratively export all parts into some simple naming scheme {$filename_part####.stl}.
My mesh stat:

================= Results produced by ADMesh version 0.98.3 ================
Input file         : 3D printer lisa2 kopia.STL
File type          : ASCII STL file
Header             : solid 3D printer lisa2 kopia
============== Size ==============
Min X =  3.451944, Max X =  679.851929
Min Y =  1.935641, Max Y =  507.128204
Min Z =  0.237500, Max Z =  890.737488
========= Facet Status ========== Original ============ Final ====
Number of facets                 : 15094772               15094772
Facets with 1 disconnected edge  :     0                   0
Facets with 2 disconnected edges :     0                   0
Facets with 3 disconnected edges :     0                   0
Total disconnected facets        :     0                   0
=== Processing Statistics ===     ===== Other Statistics =====
Number of parts       :  1535        Volume   :  40352388.000000
Degenerate facets     :     0
Edges fixed           :     0
Facets removed        :     0
Facets added          :     0
Facets reversed       :     0
Backwards edges       :     0
Normals fixed         : 13474435

thanks in advance ;)

Library calls exit - possible solution

As admesh was never intended to be a library, it calls exit() on error. That is not very developer friendly, as if someone uses admesh as a library, he/she cannot catch the error and display it to the user properly.

I was thinking how to solve this problem without breaking the API by changing all the void functions to int returning a susses/failure information.

My idea is to add int error to stl_file structure. When a function call fails, it would not exit, but instead just raises the error flag by setting stl->error to 1.

When the error flag is raised, no other function would do anything. Developer might want to clean the flag, that would be possible by some function like stl_clean_error_flag() (or rewriting the error value back to 0 manually). For safe usage, after all function calls, the developer should check the error flag and do whatever he/she wants about it: display an error message, exit, or do something completely different.

For convenience I plan a function stl_exit_on_error() that would clean the memory and exit.

I do not plan to store textual information about what happened, because there are only few places when an exit is happening now and it is pretty clear form the context.

I would like to hear some thoughts about this from others, especially from @alexrj -> would this be acceptable for slic3r? I think you have deleted some exit statements already and the error detection might be nice... ?

cc @gladk @kliment @iXce

post installation error - not sure if installed properly

Hello, I followed the instruction:
./configure
make

then i used "sudo make install"
I guess " sudo make install " should work in the same way as " su -c 'make install' "

After that, when I call admesh, it tells me:

admesh: error while loading shared libraries: libadmesh.so.1: cannot open shared object file: No such file or directory

Thanks

JT

New version 1.0

I am going to release a new admesh version. 1.0

Please let me know here if there are some reasons against it.

Cannot find stl.h

Hi, I'm importing admesh library to my cmake project, I've followed the INSTALL instructions from the file in root directory and it was copied in usr/local/include / usr/local/lib. So, I've added this in my CMakeList:

find_path(ADMESH_INCLUDE_DIR stl.h HINTS "/usr/local/include/admesh")
FIND_LIBRARY(ADMESH_LIBRARY NAMES admesh)

FIND_PACKAGE_HANDLE_STANDARD_ARGS(ADMESH  DEFAULT_MSG  ADMESH_LIBRARY  ADMESH_INCLUDE_DIR)

IF(ADMESH_FOUND)
    message("admesh found")
    SET( ADMESH_LIBRARIES ${ADMESH_LIBRARY} )
ENDIF(ADMESH_FOUND)

include_directories(${ADMESH_INCLUDE_DIR})

target_link_libraries(project PRIVATE  admesh ${ADMESH_LIBRARIES})

but when I tried to build it give me this error:

fatal error: 'admesh/stl.h' file not found
#include <admesh/stl.h>
         ^~~~~~~~~~~~~~
1 error generated.

It prints admesh found so I think that there is something wrong in my CMakeList. How can I fix it?

Compile into exe

hi,

I'm trying to compile admesh into exe but couldn't get through.
I download the latest version: admesh-0.98.2
I tried the the following in cmd but doesn't seem to work.

  ./configure
 make
 su -c 'make install'

I have a compiler: gcc version 4.9.2 (i686-posix-sjlj, built by strawberryperl.com project)
Am I using the wrong compiler?

Please guide me.
Thank you.

Mac Maviricks make command fails.

Hi,

I a trying to compile admesh in mavricks, but since the -gc is depreciated , it keeps failing in

AM_LDFLAGS =
-Wl,--gc-sections
-Wl,--as-needed
-no-undefined

MacBook-Pro:admesh mk$ make
/Applications/Xcode.app/Contents/Developer/usr/bin/make all-am
CC connect.lo
CC normals.lo
CC shared.lo
CC stlinit.lo
CC stl_io.lo
CC util.lo
CCLD libadmesh.la
ld: unknown option: --gc-sections
collect2: error: ld returned 1 exit status
make[1]: *** [libadmesh.la] Error 1
make: *** [all] Error 2

MacBook-Pro:admesh mk$ ./configure

If i remove the -Wl,--gc-sections \ then i get other errors. Can anyone help me on how to get this compiled in mac mavericks.

thank you

stl_fix() function

Would be nice to separate the process from admesh.c and have a function for it available for others.

Sync with Slic3r

Last sync with Slic3r happened long time ago. Before 0.99 it has to happen again.

Do not write errors to stderr, but add them to error buffer

...so apps using ADMesh can work with the error message. For example for Python bindings, it shall be the text of the AdmeshError exception.

We might use the errno mechanism for this, but this might need further investigation.

stl_exit_on_error() would then write it to stderr with a perror() call, so apps using that will not change their behavior.

Investigate and fix memory leaks.

There is usually some still reachable or lost memory after exit, probably improperly closed files and/or not freed structs.

Example on block.stl:

==5308== HEAP SUMMARY:
==5308==     in use at exit: 816 bytes in 2 blocks
==5308==   total heap usage: 13 allocs, 11 frees, 662,568 bytes allocated
==5308== 
==5308== LEAK SUMMARY:
==5308==    definitely lost: 816 bytes in 2 blocks
==5308==    indirectly lost: 0 bytes in 0 blocks
==5308==      possibly lost: 0 bytes in 0 blocks
==5308==    still reachable: 0 bytes in 0 blocks
==5308==         suppressed: 0 bytes in 0 blocks
==5308== Rerun with --leak-check=full to see details of leaked memory
==5308== 
==5308== For lists of detected and suppressed errors, rerun with: -s
==5308== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Update README

The README needs to be updated to reflect the current state:

  • Part about the command line app
  • Part about the library

Non-zero exit code if errors

Could you please have it set a non-zero exit code if there are any errors detected in the file?

That would make it far easier to use it in a processing script than trying to parse the output.

Thanks.

examples with screenshoot

The captures of screen and the code to illustrate that it does the source code

las capturas de pantalla y el codigo para ilustrar que hace el codigo fuente

Wrong NULL check in Allocate memory for the neighbors list

stlinit.c line 157
155: /* Allocate memory for the neighbors list /
156: stl->neighbors_start = (stl_neighbors
) calloc(stl->stats.number_of_facets, sizeof(stl_neighbors));
157: if(stl->facet_start == NULL) perror("stl_initialize");

Need to check (stl->neighbors_start == NULL)!

heap-buffer-flow in stl_update_connects_remove_1

Find a heap-buffer-overflow with the input. Hope this report is helpful.

0.zip

ADMesh version 0.99.0dev, Copyright (C) 1995, 1996 Anthony D. Martin
ADMesh comes with NO WARRANTY.  This is free software, and you are welcome to
redistribute it under certain conditions.  See the file COPYING for details.
Opening 0
Checking exact...
Checking nearby. Tolerance= 3.937008 Iteration=1 of 2...  Fixed 2 edges.
Checking nearby. Tolerance= 196854.328125 Iteration=2 of 2...  Fixed 0 edges.
Removing unconnected facets...
=================================================================
==29577==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x610000000030 at pc 0x7f791f89fefe bp 0x7fffd3395da0 sp 0x7fffd3395d98
READ of size 4 at 0x610000000030 thread T0
    #0 0x7f791f89fefd in stl_update_connects_remove_1 /home/t/Projects/afl/fuzzing-experiments/subjects/admesh/src/connect.c:831:9
    #1 0x7f791f89fefd in stl_remove_degenerate /home/t/Projects/afl/fuzzing-experiments/subjects/admesh/src/connect.c:796
    #2 0x7f791f89fefd in stl_remove_unconnected_facets /home/t/Projects/afl/fuzzing-experiments/subjects/admesh/src/connect.c:728
    #3 0x7f791f8cf622 in stl_repair /home/t/Projects/afl/fuzzing-experiments/subjects/admesh/src/util.c:527:7
    #4 0x51a148 in main /home/t/Projects/afl/fuzzing-experiments/subjects/admesh/src/admesh.c:303:3
    #5 0x7f791e8dab96 in __libc_start_main /build/glibc-OTsEL5/glibc-2.27/csu/../csu/libc-start.c:310
    #6 0x41af79 in _start (/home/t/Projects/afl/fuzzing-experiments/subjects/admesh/.libs/admesh+0x41af79)

0x610000000030 is located 16 bytes to the left of 192-byte region [0x610000000040,0x610000000100)
allocated by thread T0 here:
    #0 0x4e382f in calloc /home/t/Projects/lldb-testing/llvm/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:155
    #1 0x7f791f8b5239 in stl_allocate /home/t/Projects/afl/fuzzing-experiments/subjects/admesh/src/stlinit.c:185:26
    #2 0x7f791f8b5239 in stl_open /home/t/Projects/afl/fuzzing-experiments/subjects/admesh/src/stlinit.c:42

SUMMARY: AddressSanitizer: heap-buffer-overflow /home/t/Projects/afl/fuzzing-experiments/subjects/admesh/src/connect.c:831:9 in stl_update_connects_remove_1
Shadow bytes around the buggy address:
  0x0c207fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c207fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c207fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c207fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c207fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x0c207fff8000: fa fa fa fa fa fa[fa]fa 00 00 00 00 00 00 00 00
  0x0c207fff8010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  0x0c207fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c207fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c207fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
  0x0c207fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
  Addressable:           00
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa
  Freed heap region:       fd
  Stack left redzone:      f1
  Stack mid redzone:       f2
  Stack right redzone:     f3
  Stack after return:      f5
  Stack use after scope:   f8
  Global redzone:          f9
  Global init order:       f6
  Poisoned by user:        f7
  Container overflow:      fc
  Array cookie:            ac
  Intra object redzone:    bb
  ASan internal:           fe
  Left alloca redzone:     ca
  Right alloca redzone:    cb
  Shadow gap:              cc
==29577==ABORTING

Heap Buffer overflow

I have just downloaded 0.98.3 tarball and compiled it successfully, but when trying to repair a file with './admesh myFile.stl'
runner.zip

, I got a segfault when filling holes. I've run a gdb that crashed here :
stl->facet_start[stl->stats.number_of_facets] = *new_facet;

but stl->stats.number_of_facets was lower than stl->stats.facets_malloced, so everything should have worked.

I've run an address sanitize using clang, and it found a heap buffer overflow. Following is the report :

==30521==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x7f114f34a7f4 at pc 0x7f1152e07fdc bp 0x7fffc28e36b0 sp 0x7fffc28e36a8
WRITE of size 4 at 0x7f114f34a7f4 thread T0
#0 0x7f1152e07fdb in stl_remove_degenerate /home/xxx/Downloads/admesh/admesh-0.98.1/src/connect.c:808:61
#1 0x7f1152e07fdb in stl_remove_unconnected_facets /home/xxx/Downloads/admesh/admesh-0.98.1/src/connect.c:728
#2 0x7f1152e1a930 in stl_repair /home/xxx/Downloads/admesh/admesh-0.98.1/src/util.c:508:7
#3 0x4dad8a in main /home/xxx/Downloads/admesh/admesh-0.98.1/src/admesh.c:303:3
#4 0x7f1151fd0eac in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x1eeac)
#5 0x41fb88 in _start (/home/xxx/Downloads/admesh/admesh-0.98.1/.libs/admesh+0x41fb88)

0x7f114f34a7f4 is located 12 bytes to the left of 1405216-byte region [0x7f114f34a800,0x7f114f4a1920)
allocated by thread T0 here:
#0 0x4b5f54 in calloc /tmp/llvm/projects/compiler-rt/lib/asan/asan_malloc_linux.cc:66:3
#1 0x7f1152e0e312 in stl_allocate /home/xxx/Downloads/admesh/admesh-0.98.1/src/stlinit.c:177:26
#2 0x7f1152e0e312 in stl_open /home/xxx/Downloads/admesh/admesh-0.98.1/src/stlinit.c:40

so, stl_remove_degenerate is overwriting some memory that makes the stl_add_facet crash later

attached the stl file used to make it crash

uninitialized extra values when loading ascii stl

When loading an ASCII STL file, the facet extra values are set to random values.

This is because the facet is an uninitialized structure on the stack. During the load process of a binary STL, these values will be read correctly. But these values are skipped during the load process of an ASCII STL, leaving the uninitialized values untouched.

Situations where an ASCII STL is read, but a Binary STL is written would then result in different output across multiple runs.

An easy fix is to simply set the extra values to zero at the beginning of the load process. If the load is binary, that value will be overwritten for each facet. If the load is ASCII then the zero value can be correctly used for each facet.

--write-binary-stl doesnt produce a readable stl file

Files created using --write-binary-stl cant be openned in meshmixer or cura. Files written with --write-ascii-stl can be openned in meshmixer or cura.

--write-binary-stl seems to increase the file size by a small amount when given a binary input.

Windows: the converting from ascii stl to binary is incorrect

In Windows I use the following command for converting:
admesh.exe -b output.stl input.stl
After converting the output.stl file is incorrect. I can not view the output.stl in openscad or fstl.

admesh version is 0.98.2.
The converting works normally in Fedora Linux 24 64bit.

I attached some stl files for check.
check_stl_files.zip
The r1.stl is the original input stl file.
The r1_b.stl is the correct binary output stl file which i generated in Fedora Linux.
The r2_b.stl is the incorrect binary output stl file which i generated in Windows 7 32bit.

The 64bit admesh in Windows 8 64bit also generates incorrect stl output file.

This is the admesh output from Windows 7 32bit:
ADMesh version 0.98.2, Copyright (C) 1995, 1996 Anthony D. Martin
ADMesh comes with NO WARRANTY. This is free software, and you are welcome to
redistribute it under certain conditions. See the file COPYING for details.
Opening r1.stl
Checking exact...
All facets connected. No nearby check necessary.
No unconnected need to be removed.
No holes need to be filled.
Checking normal directions...
Checking normal values...
Calculating volume...
Verifying neighbors...
Writing binary file r2_b.stl

================= Results produced by ADMesh version 0.98.2 ================
Input file : r1.stl
File type : ASCII STL file
Header : solid OpenSCAD_Model
============== Size ==============
Min X = -14.048400, Max X = 13.838600
Min Y = -13.887000, Max Y = 17.313000
Min Z = -9.480440, Max Z = 21.405500
========= Facet Status ========== Original ============ Final ====
Number of facets : 690 690
Facets with 1 disconnected edge : 0 0
Facets with 2 disconnected edges : 0 0
Facets with 3 disconnected edges : 0 0
Total disconnected facets : 0 0
=== Processing Statistics === ===== Other Statistics =====
Number of parts : 2 Volume : 11488.410156
Degenerate facets : 0
Edges fixed : 0
Facets removed : 0
Facets added : 0
Facets reversed : 0
Backwards edges : 0
Normals fixed : 0

Build release with last commit

Could you please build a new release with the last commit? I would do it myself by I don't think this can be done by contributors.

Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.